Użyć form_for Railsów, ale ustawić niestandardowe klasy, atrybuty w elemencie <form>?

91

form_forwydaje się ignorować wszelkie „dodatkowe” atrybuty, takie jak data-fooatrybut, lub classprzekazywane jak optionsw drugim argumencie.

= form_for @user, {:url => 'foo', :class => 'x', 'data-bar' => 'baz' } do |f|
  # ...

Dane wyjściowe to <form>znacznik bez xklasy ani data-baratrybutu.

Jaka jest poprawka?

Albo jak mogę pobrać FormBuilderinstancję bez używania form_for?

Alan H.
źródło

Odpowiedzi:

194

Użyj :htmlskrótu:

= form_for @user, :html => {:class => 'x', 'data-bar' => 'baz'} do |f|

Lub

= form_for @user, html: {class: 'x', data: { bar: 'baz' } } do |f|
MurifoX
źródło
1
Okazało się, że to nie działa: = form_for @user, :html => {'class' => 'x'} do |f|. classpowinien być symbolem zamiast ciągu.
Trantor Liu
11

Rails 4.0.3, Ruby 2.1.0p0 -> to działało dla mnie =>

<%= form_for(@contact, :html => {:class => 'form_height'}) do |f| %><% if     @contact.errors.any? %>
zero_cool
źródło
4

Miałem ten sam problem, ale byłem zdziwiony, że inny formularz w innym miejscu w mojej aplikacji działa dobrze.

Zdałem sobie sprawę, że przypadkowo dodałem form_for wewnątrz innego form_for, który po usunięciu rozwiązał problem.

Po drugie, powinienem dodać, że taka składnia działa u mnie w Railsach 4.2:

<%= form_for @type, html: {class: "form-horizontal"} do |f| %>

Uważam, że jest to lepsze od zupy interpunkcyjnej innych odpowiedzi tutaj (które być może były oparte na starszej wersji Rails).

MSC
źródło
1

W większości helperów ostatni argument jest skrótem opcji html dla elementu.

= form_for @user, :html => {:class => 'x', 'data-bar' => 'baz'} %>

Możesz również sprawdzić inne alternatywy w dokumentacji ActionsView :: Helpers :: FormHelper

felipeclopes
źródło
1

Wypróbowałem powyższe bez powodzenia, ale znalazłem rozwiązanie. Używam szyn 4.1.6.

To nie zadziałało

= form_for @user, :html => {:class => 'x', 'data-bar' => 'baz'} %>

To zrobił

= form_for @user, html: {:class => 'x', 'data-bar' => 'baz'} %>

Zauważ różnicę z opcją HTML, mam nadzieję, że to pomoże

doz87
źródło
3
Łał, naprawdę? powinny one być dokładnie równoważne. Możesz to odtworzyć? Której wersji Rubiego używasz?
Alan H.
@Alan H. Używanie Rubiego 2.1.3p242 = form_for(:user, :url => login_path, html: {:class => 'login_form'}) do |f| %> To był jedyny sposób, w jaki mój kod zastosowałby tę klasę, w przeciwnym razie po prostu ją zignorował.
doz87
Te dwie linie są dokładnie identyczne. Zgadujesz, że zapomniałeś zapisać w międzyczasie?
nathanvda
Wiem, że powinny. Jednak dla mnie to po prostu nie działało. Oszczędzanie nie było problemem.
doz87