Використовувати 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|

1
Я виявив , що це не працює: = form_for @user, :html => {'class' => 'x'} do |f|. classмає бути символом замість рядка.
Трантор Лю


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, сподіваємось, це допоможе


3
Та не вже? вони повинні бути точно еквівалентними. Ви можете відтворити це? Яку версію Ruby ви використовуєте?
Алан Х.

@Alan H. Використання Ruby 2.1.3p242 = form_for(:user, :url => login_path, html: {:class => 'login_form'}) do |f| %> Це був єдиний спосіб, яким мій код застосував клас, інакше він просто ігнорував його.
doz87

Ці два рядки абсолютно ідентичні. Здогадуючись, що ви забули заощадити між ними?
nathanvda

Я знаю, вони повинні бути. Для мене це просто не працювало, хоча. Збереження не було проблемою.
doz87
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.