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?

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|

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

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


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


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


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.