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