2012-05-31 12 views
11

Dodanie klasy dla opcji form_for za pośrednictwem opcji html: {class: "form-horizontal"} zastępuje domyślną klasę new_model lub edit_model. Jak dodać swoją klasę przy zachowaniu istniejącej klasy form_helper?Jak dodać klasę do formularza w rubinach na szynach bez ustawiania/przesłonięcia istniejącej domyślnej klasy pomocnika?

chcę:

<form class="edit_model form-horizontal"> lub

<form class="new_model form-horizontal">

Zamiast:

<form class="form-horizontal">

Odpowiedz

0
html: {class: "edit_model form-horizontal"} 
+2

Piękno kreatora formularzy polega na tym, że automatycznie przełącza się między klasami edit_model i new_model.Chciałbym elegancki sposób, aby to zrobić bez konieczności umieszczania obiektu wewnątrz instrukcji if, która wykrywa, czy jest to nowy obiekt. – Evan

1

Może nie jest to idealne rozwiązanie, ale Czy za to robić z JS/Jquery?

Na przykład:

$(document).ready(function(){ 
    $('form.edit_model').addClass('form-horizontal') 
}); 
6

wpadłem na dokładnie tej samej kwestii. W końcu wpadłem na to rozwiązanie

form_for @foo, :html => {:class => "form-horizontal #{controller.action_name}_model_name"} 

To może być trochę za późno na to, aby być o wiele dają, ale może ktoś inny znajdzie to użyteczne.

0

Czy próbowałeś użyć metody scalania? [http://ruby-doc.org/core-1.9.3/Hash.html#method-i-merge] Coś jak html = html.merge (nowy) {| klucz, wartość1, wartość2 | value1 + "" + value2} pozwoli ci wprowadzić nową wartość do wartości klasy. [Szybka edycja: Zachowaj ostrożność, konfigurując i testując implementację, aby nie całkowicie nadpisać html).

0

Możesz użyć pomocnika widoku dom_class(object, prefix = nil), aby wygenerować nazwy klas, takie jak form_for.

To nie jest bardzo czyste, robi to bezpośrednio w formie, ale włączenie go do pomocnika może być tylko biletem. Na przykład:

# app/helpers/application_helper.rb 
def class_for object, *additional_classes 
    additional_classes.unshift dom_class(object, object.persisted? ? 'edit' : 'new') 
end 

# app/views/models/_form.html.erb 
<%= form_for @model, :html => {:class => class_for(@model, 'form-horizontal')} do |f| %> 
    <%# ... %> 
<% end %> 

<form class="new_model form-horizontal" ...> 
1

Definiowanie klas za pomocą opcji :html => {:class => '...'} zastępuje wszelkie klasy dodane przez domyślny program budujący. Możesz jednak dołączyć klasy CSS do bloku bez przesłonięcia tych klas.

Przy pomocy pomocnika form_for:class będzie ciągiem, jeśli nie zostanie ustawione inaczej. Zwróć uwagę na pole wiodące podczas dodawania.

<%= form_for @model do |f| %> 
    <% f.options[:html][:class] << ' form-horizontal' %> 
    <%# ... %> 
<% end %> 

<form class="edit_model form-horizontal"> 

Jeśli używasz simple_form_for pomocnika, options[:html][:class] będzie tablicą, i nie potrzeba dodatkowego miejsca lidera (chociaż to nie boli).

<%= simple_form_for @model do |f| %> 
    <% f.options[:html][:class] << 'form-horizontal' %> 
    <%# ... %> 
<% end %> 

<form class="simple_form edit_model form-horizontal"> 

Jeśli używasz symbolu zamiast modelu form_for nie ustawi klasę i options[:html][:class] będzie nil w bloku. Ale jeśli to robisz, to i tak nie masz modelu, który mógłby być nowy lub utrwalony.

<%= form_for :model do |f| %> 
    <% f.options[:html][:class] << ' form-horizontal' %> 
    <%# ... %> 
<% end %> 

NoMethodError: undefined method `<<' for nil:NilClass 
Powiązane problemy