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.