Использовать Rails form_for, но устанавливать собственные классы и атрибуты в элементе <form>?

91

form_forпохоже, игнорирует любые «лишние» атрибуты, такие как data-fooатрибут или classпереданные, как optionsво втором аргументе.

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

Результатом является <form>тег без xкласса или data-barатрибута.

Что исправить?

Или как я могу получить FormBuilderэкземпляр без использования form_for?

Алан Х.
источник

Ответы:

194

Используйте :htmlхеш:

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

Или

= form_for @user, html: {class: 'x', data: { bar: 'baz' } } do |f|
MurifoX
источник
1
Я обнаружил , что это не работает: = form_for @user, :html => {'class' => 'x'} do |f|. classдолжен быть символ вместо строки.
Trantor Liu
11

Rails 4.0.3, Ruby 2.1.0p0 -> у меня это сработало =>

<%= form_for(@contact, :html => {:class => 'form_height'}) do |f| %><% if     @contact.errors.any? %>
zero_cool
источник
4

У меня была та же проблема, но я был озадачен тем, что другая форма в другом месте моего приложения работала нормально.

Я понял, что случайно добавил form_for внутри другого form_for, который после удаления вылечил проблему.

Во-вторых, я должен добавить, что этот синтаксис у меня работает в Rails 4.2:

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

Я считаю, что это предпочтительнее, чем другие ответы здесь (которые, возможно, были основаны на более старой версии Rails).

МСК
источник
1

В большинстве хелперов последний аргумент - это хэш параметров HTML для элемента.

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

Вы также можете проверить другие альтернативы в документации ActionsView :: Helpers :: FormHelper.

кошачьи скобы
источник
1

Я безуспешно пробовал это, но нашел решение. Пользуюсь рельсами 4.1.6.

Это не сработало

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

Это сделало

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

обратите внимание на разницу с опцией html, надеюсь, это поможет

doz87
источник
3
Ого, правда? они должны быть точно эквивалентными. Вы можете это воспроизвести? Какую версию Ruby вы используете?
Алан Х.
@Alan H. Использование Ruby 2.1.3p242 = form_for(:user, :url => login_path, html: {:class => 'login_form'}) do |f| %> Это был единственный способ, которым мой код применил класс, иначе он просто игнорировал его.
doz87
Эти две строки абсолютно идентичны. Думаете, вы забыли сохранить в промежутке?
nathanvda
Я знаю, так и должно быть. Но для меня это просто не сработало. Сохранение не было проблемой.
doz87