2013-08-12 13 views
5

Ich habe ein Modell Dokument, das Attribute Art und Kontext hat. Kind ist eine Ganzzahl, die als Enum verwendet wird (mit dem ausgezeichneten active_enum Juwel). Der Kontext bezieht sich nur auf Dokumente der Art "2", d. H. Wenn ein Dokument mit einer anderen als 2 ist, wird der Kontext leer sein.Schienen: Die beste Möglichkeit, ein Formularfeld bedingt ein-/auszublenden?

So in der Formularseite ein neues Dokument zu erstellen, habe ich ein <select> die Art zu wählen, und ein Textfeld für den Kontext, die zunächst verborgen ist:

<%= form_for @document do |f| %> 

    ... 

    <%= f.text_area :context, placeholder: 'Context', style: 'display:none' %> 

    <%= f.select :kind, Document.active_enum_for(:kind).to_select %> 

    ... 

<% end %> 

Und das Textfeld angezeigt und versteckt Verwenden der jQuery-Methoden show() und hide() in einer Funktion, die an das Ereignis change() im Dropdown-Menü gebunden ist.

So weit, so gut. Aber auf der Seite bearbeiten für Dokumente, ich möchte nicht den Kontext textarea zu immer ausgeblendet werden auf der ersten Seite laden, weil wir ein Dokument der Art bearbeiten können. Ich möchte, dass das Textfeld zuerst angezeigt wird, wenn wir ein Dokument vom Typ 2 bearbeiten, aber in anderen Fällen verborgen sind.

Hier ist, was ich habe jetzt:

<% if @document.kind == 2 %> 
    <%= f.text_area :context, placeholder: 'Context' %> 
<% else %> 
    <%= f.text_area :context, placeholder: 'Context', style: 'display:none' %> 
<% end %> 

Gibt es nicht einen besseren Weg, dies zu tun? Das fühlt sich für mich etwas wortreich und überflüssig an; Gibt es keine Möglichkeit, ich kann nur einen Anruf an f.text_area und die style: Option bedingt enthalten?

Oder überschätze ich das?

Antwort

10

verwenden:

<%= f.text_area :context, placeholder: 'Context', style: "#{'display:none' if @document.kind == 2}" %> 

oder Sie können eine CSS-Klasse für diese Erweiterung,

display-none{ 
    display:none; 
} 

<%= f.text_area :context, placeholder: 'Context', class: "#{'display-none' if @document.kind == 2}" %> 

Dank

+0

kein Inline-Style bitte ... – nXqd

+2

Ich stimme zu, dass Inline-Styling in 99% der Fälle eine schreckliche Idee ist, aber ich denke "display: none;" für ein Element, das mit Javascript versteckt und gezeigt werden soll, kann eine Ausnahme sein. – GMA

0

oder Sie können Javascript versuchen? Es ist eine Möglichkeit, den doppelten Code zu reduzieren. Wenn Sie viele Felder zu verbergen haben, hat dieser Weg einige Vorteile.

Verwandte Themen