¿Usar form_for de Rails pero establecer clases personalizadas, atributos en el elemento <form>?

91

form_forparece ignorar cualquier atributo 'extra' como un data-fooatributo o classpasado como optionsen su segundo argumento.

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

La salida es una <form>etiqueta sin xclase ni data-baratributo.

¿Cuál es la solución?

O, ¿cómo puedo tomar una FormBuilderinstancia sin usar form_for?

Alan H.
fuente

Respuestas:

194

Usa el :htmlhash:

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

O

= form_for @user, html: {class: 'x', data: { bar: 'baz' } } do |f|
MurifoX
fuente
1
He descubierto que esto no funciona: = form_for @user, :html => {'class' => 'x'} do |f|. classdebe ser un símbolo en lugar de una cadena.
Trantor Liu
11

Rails 4.0.3, Ruby 2.1.0p0 -> esto funcionó para mí =>

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

Tuve el mismo problema, pero me sorprendió que otro formulario en otra parte de mi aplicación funcionara bien.

Me di cuenta de que había agregado accidentalmente un form_for dentro de otro formulario_for que una vez eliminado solucionó el problema.

En segundo lugar, debo agregar que esta sintaxis me funciona en Rails 4.2:

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

Lo encuentro preferible a la sopa de puntuación de las otras respuestas aquí (que quizás se basaron en una versión anterior de Rails).

MSC
fuente
1

En la mayoría de los ayudantes, el último argumento es un hash de opciones html para el elemento.

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

También puede consultar otras alternativas en la documentación ActionsView :: Helpers :: FormHelper

felipeclopes
fuente
1

Intenté lo anterior sin suerte, pero encontré una solución. Estoy usando rieles 4.1.6.

Esto no funcionó

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

Esto hizo

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

note la diferencia con la opción html, espero que esto ayude

doz87
fuente
3
¿Wow en serio? esos deberían ser exactamente equivalentes. ¿Puedes reproducir esto? ¿Qué versión de Ruby estás usando?
Alan H.
@Alan H. Usando Ruby 2.1.3p242 = form_for(:user, :url => login_path, html: {:class => 'login_form'}) do |f| %> Esta era la única forma en que mi código aplicaría la clase, de lo contrario, simplemente la ignoraba.
doz87
Esas dos líneas son exactamente idénticas. ¿Supongo que olvidó guardar en el medio?
nathanvda
Lo sé, deberían serlo. Sin embargo, para mí simplemente no estaba funcionando. Ahorrar no era el problema.
doz87