Utilizzare il form_for di Rails ma impostare classi personalizzate, attributi sull'elemento <form>?


89

form_forsembra ignorare qualsiasi attributo "extra" come un data-fooattributo o classpassato come optionsnel secondo argomento.

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

L'output è un <form>tag senza xclasse o data-barattributo.

Qual è la soluzione?

Oppure, come posso acquisire FormBuilderun'istanza senza utilizzarla form_for?

Risposte:


191

Usa l' :htmlhash:

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

O

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

1
Ho trovato che questo non funziona: = form_for @user, :html => {'class' => 'x'} do |f|. classdovrebbe essere un simbolo invece di una stringa.
Trantor Liu

11

Rails 4.0.3, Ruby 2.1.0p0 -> questo ha funzionato per me =>

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

4

Ho avuto lo stesso problema ma ero perplesso che un altro modulo altrove nella mia app funzionasse bene.

Mi sono reso conto di aver accidentalmente aggiunto un form_for all'interno di un altro form_for che una volta rimosso risolveva il problema.

In secondo luogo, dovrei aggiungere che questa sintassi funziona per me in Rails 4.2:

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

Lo trovo preferibile alla zuppa di punteggiatura delle altre risposte qui (che erano forse basate su una vecchia versione di Rails).


1

Nella maggior parte degli helper, l'ultimo arg è un hash di opzioni html per l'elemento.

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

Puoi anche controllare altre alternative nella documentazione ActionsView :: Helpers :: FormHelper


1

Ho provato quanto sopra senza fortuna ma ho trovato una soluzione. Sto usando i binari 4.1.6.

Questo non ha funzionato

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

Questo ha fatto

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

nota la differenza con l'opzione html, spero che questo aiuti


3
Wow veramente? quelli dovrebbero essere esattamente equivalenti. Puoi riprodurre questo? Quale versione di Ruby stai usando?
Alan H.

@Alan H. Utilizzo di Ruby 2.1.3p242 = form_for(:user, :url => login_path, html: {:class => 'login_form'}) do |f| %> Questo era l'unico modo in cui il mio codice avrebbe applicato la classe, altrimenti la stava semplicemente ignorando.
doz87

Queste due linee sono esattamente identiche. Immagino che ti sei dimenticato di salvare in mezzo?
nathanvda

Lo so, dovrebbero esserlo. Per me però non funzionava. Il risparmio non era il problema.
doz87
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.