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

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|

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

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


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


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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.