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?

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|

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? %>

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).



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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.