Utiliser form_for de Rails mais définir des classes personnalisées, des attributs sur l'élément <form>?

89

form_forsemble ignorer tout attribut «supplémentaire» comme un data-fooattribut ou classpassé comme optionsdans son deuxième argument.

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

La sortie est une <form>balise sans xclasse ni data-barattribut.

Quelle est la solution?

Ou, comment puis-je récupérer une FormBuilderinstance sans l'utiliser form_for?

Alan H.
la source

Réponses:

191

Utilisez le :htmlhachage:

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

Ou

= form_for @user, html: {class: 'x', data: { bar: 'baz' } } do |f|
MurifoX
la source
1
Je trouve que cela ne fonctionne pas: = form_for @user, :html => {'class' => 'x'} do |f|. classdevrait être un symbole au lieu d'une chaîne.
Trantor Liu
11

Rails 4.0.3, Ruby 2.1.0p0 -> cela a fonctionné pour moi =>

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

J'ai eu le même problème, mais j'étais étonné qu'un autre formulaire ailleurs dans mon application fonctionne correctement.

J'ai réalisé que j'avais accidentellement ajouté un form_for dans un autre form_for qui, une fois supprimé, avait résolu le problème.

Deuxièmement, je dois ajouter que cette syntaxe fonctionne pour moi dans Rails 4.2:

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

Je trouve cela préférable à la soupe de ponctuation des autres réponses ici (qui étaient peut-être basées sur une version plus ancienne de Rails).

MSC
la source
1

Sur la plupart des helpers, le dernier argument est un hachage d'options html pour l'élément.

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

Vous pouvez également consulter d'autres alternatives dans la documentation ActionsView :: Helpers :: FormHelper

félipéclopes
la source
1

J'ai essayé ce qui précède sans succès mais j'ai trouvé une solution. J'utilise des rails 4.1.6.

Cela n'a pas fonctionné

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

Cela a fait

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

remarquez la différence avec l'option html, j'espère que cela vous aidera

doz87
la source
3
Oh vraiment? ceux-ci devraient être exactement équivalents. Vous pouvez reproduire cela? Quelle version de Ruby utilisez-vous?
Alan H.
@Alan H. Utilisation de Ruby 2.1.3p242 = form_for(:user, :url => login_path, html: {:class => 'login_form'}) do |f| %> C'était la seule façon pour mon code d'appliquer la classe, sinon il l'ignorait simplement.
doz87
Ces deux lignes sont exactement identiques. Vous pensez avoir oublié d'économiser entre les deux?
nathanvda
Je sais, ils devraient l'être. Pour moi, cela ne fonctionnait tout simplement pas. La sauvegarde n'était pas le problème.
doz87