2010-05-18 17 views
14

Tengo una lista de casillas de verificación en un formulario. Debido a la forma en que está estructurado el CSS, el elemento de etiqueta tiene un estilo directo. Esto me obliga a anidar la casilla de verificación dentro de la etiqueta.Envoltura <% = f.check_box%> dentro de <label>

Esto funciona en HTML sin procesar, si hace clic en el texto de la etiqueta, el estado de la casilla cambia. Sin embargo, no funciona con el auxiliar <%= f.check_box %> de rieles, ya que primero emite una etiqueta de entrada oculta.

En resumen,

<label> 
    <%= f.check_box :foo %> 
    Foo 
</label> 

Ésta es la salida que quiero :

<label> 
    <input type="checkbox" ... /> 
    <input type="hidden" ... /> 
    Foo 
</label> 

... pero esto es lo que Rails es darme:

<label> 
    <input type="hidden" ... /> 
    <input type="checkbox" ... /> 
    Foo 
</label> 

Entonces, el comportamiento de la etiqueta no actúa lly trabajo :(.

¿Hay alguna forma de evitar esto?

+0

Así que cuando se anidan '' elementos dentro de una etiqueta de ''

+0

Eso es correcto, sin embargo nfm señaló que la orden es delicada y no funcionará al revés. –

Respuesta

7

Rails genera la entrada oculta antes de la casilla de verificación porque necesita una forma de saber si el formulario se envió con la casilla de verificación sin marcar. El orden es sensible ya que la casilla anula la entrada oculta si se ha marcado. Vea el Rails API para más detalles.

Debe usar <label for="checkbox_id"> en lugar de colocar la casilla de verificación en la etiqueta de su etiqueta.

+1

Esto es lo que terminé haciendo, pero me pareció innecesario proporcionar mi propio ID a la casilla para poder usarlo en la etiqueta. Gracias por la información sobre _why_ –

+2

Twitter Bootstrap está usando esta sintaxis anidada. – Jan

-3

Esa no es la forma de utilizar la etiqueta label. En su lugar utilizar de esta manera:

<input type="hidden" ... /> <!-- doesn't really matter where these are --> 

<label for="id_of_element">Foo</label> 
<input type="checkbox" id="id_of_element" ... />

actúa ahora "foo" como una etiqueta para el elemento de casilla, y usted puede hacer clic en "Foo" para activar o desactivar la misma.

+9

Esa es una forma perfectamente aceptable de usar la etiqueta 'label'. Vea aquí: http://www.w3.org/TR/html401/interact/forms.html#h-17.9.1 especialmente esto: "for = idref [CS]. Este atributo asocia explícitamente la etiqueta que se está definiendo con otro control Cuando está presente, el valor de este atributo debe ser el mismo que el valor del atributo id de algún otro control en el mismo documento.Cuando está ausente, la etiqueta que se está definiendo está asociada con los contenidos del elemento. "* EDIT *: Voy a bajar mi HTML high-horse y le doy que este es un lugar donde Rails es incompatible con el uso correcto de' label' – Ben

37

Esto funciona para mí:

<%= f.label :foo do %> 
    <%= f.check_box :foo %> 
    Foo 
<% end %> 

Renders:

<label for="foo"> 
    <input name="foo" type="hidden" value="0"> 
    <input checked="checked" id="foo" name="foo" type="checkbox" value="1"> 
    Foo 
</label> 
+1

Parece de esta manera no hay oportunidades para usar la transliteración automática como se describe aquí http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-label. ¿Tengo razón? Lo siento por el mal inglés. – woto

0

Ésta es una solución utilicé que incluye la traducción.

<%= 
    f.label(
    :foo, 
    "#{f.check_box(:foo)} #{t('helpers.label.foo')}".html_safe 
) 
%> 

En en.yml

en: 
    helpers: 
    label: 
     foo: Foo