Verwenden Sie form_for von Rails, aber legen Sie benutzerdefinierte Klassen und Attribute für das <form> -Element fest.

88

form_forscheint alle 'zusätzlichen' Attribute wie ein data-fooAttribut zu ignorieren oder classwie optionsim zweiten Argument übergeben.

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

Die Ausgabe ist ein <form>Tag ohne xKlasse oder data-barAttribut.

Was ist das Problem?

Oder wie kann ich eine FormBuilderInstanz abrufen, ohne sie zu verwenden form_for?

Alan H.
quelle

Antworten:

190

Verwenden Sie den :htmlHash:

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

Oder

= form_for @user, html: {class: 'x', data: { bar: 'baz' } } do |f|
MurifoX
quelle
1
Ich habe festgestellt, dass dies nicht funktioniert : = form_for @user, :html => {'class' => 'x'} do |f|. classsollte ein Symbol anstelle einer Zeichenfolge sein.
Trantor Liu
11

Rails 4.0.3, Ruby 2.1.0p0 -> das hat bei mir funktioniert =>

<%= form_for(@contact, :html => {:class => 'form_height'}) do |f| %><% if     @contact.errors.any? %>
zero_cool
quelle
4

Ich hatte das gleiche Problem, war aber verwirrt, dass ein anderes Formular an anderer Stelle in meiner App einwandfrei funktionierte.

Mir wurde klar, dass ich versehentlich ein form_for in ein anderes form_for eingefügt hatte, das das Problem nach dem Entfernen behoben hatte .

Zweitens sollte ich hinzufügen, dass diese Syntax in Rails 4.2 für mich funktioniert:

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

Ich finde es der Interpunktionssuppe der anderen Antworten hier vorzuziehen (die vielleicht auf einer älteren Rails-Version basierten).

MSC
quelle
1

Bei den meisten Helfern ist das letzte Argument ein Hash von HTML-Optionen für das Element.

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

Sie können auch andere Alternativen in der Dokumentation ActionsView :: Helpers :: FormHelper überprüfen

Felipeclopes
quelle
1

Ich habe das oben genannte ohne Glück versucht, aber eine Lösung gefunden. Ich benutze Schienen 4.1.6.

Das hat nicht funktioniert

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

Das hat es getan

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

Beachten Sie den Unterschied mit der HTML-Option, hoffe, dies hilft

doz87
quelle
3
Wow wirklich? diese sollten genau gleichwertig sein. Sie können dies reproduzieren? Welche Ruby-Version verwenden Sie?
Alan H.
@Alan H. Verwenden von Ruby 2.1.3p242 = form_for(:user, :url => login_path, html: {:class => 'login_form'}) do |f| %> Dies war die einzige Möglichkeit, mit der mein Code die Klasse anwenden würde, andernfalls wurde er nur ignoriert.
doz87
Diese beiden Zeilen sind genau identisch. Vermutlich haben Sie vergessen, zwischendurch zu sparen?
Nathanvda
Ich weiß, das sollten sie sein. Für mich hat es einfach nicht funktioniert. Sparen war nicht das Problem.
doz87