2009-04-14 6 views
126

Mi pregunta es similar a this one pero para una aplicación Rails.Etiquetas para botones de radio en forma de rieles

Tengo un formulario con algunos botones de opción y me gustaría asociar etiquetas con ellos. El asistente de formulario label solo toma un campo de formulario como parámetro, pero en este caso tengo varios botones de opción para un solo campo de formulario. La única forma que veo de hacerlo es crear manualmente una etiqueta, codificando con fuerza la identificación que se genera automáticamente para el botón de opción. ¿Alguien sabe de una mejor manera de hacerlo?

Por ejemplo:

<% form_for(@message) do |f| %> 
    <%= label :contactmethod %> 
    <%= f.radio_button :contactmethod, 'email', :checked => true %> Email 
    <%= f.radio_button :contactmethod, 'sms' %> SMS 
<% end %> 

Esto genera algo como:

<label for="message_contactmethod">Contactmethod</label> 
<input checked="checked" id="message_contactmethod_email" name="message[contactmethod]" value="email" type="radio"> Email 
<input id="message_contactmethod_sms" name="message[contactmethod]" value="sms" type="radio"> SMS 

Lo que quiero:

<input checked="checked" id="message_contactmethod_email" name="message[contactmethod]" value="email" type="radio"><label for="message_contactmethod_email">Email</label> 
<input id="message_contactmethod_sms" name="message[contactmethod]" value="sms" type="radio"> <label for="message_contactmethod_sms">SMS</label> 
+0

Gracias a tu pregunta El código de codificación me ayudó :) –

Respuesta

125
<% form_for(@message) do |f| %> 
    <%= f.radio_button :contactmethod, 'email', :checked => true %> 
    <%= label :contactmethod_email, 'Email' %> 
    <%= f.radio_button :contactmethod, 'sms' %> 
    <%= label :contactmethod_sms, 'SMS' %> 
<% end %> 
+77

También hay otra manera: pasar una opción ': value' a' f.label' hará lo mismo. p.ej. '<% = f.label: contactmethod, 'SMS',: value => 'sms'%>'. Esto establece correctamente el atributo "para" de la etiqueta de la etiqueta, lo que hace que al hacer clic en la etiqueta, seleccione el botón de opción apropiado. En la respuesta anterior, simplemente usar el helper 'label' hará que el atributo" for "sea incorrecto cuando se crea el botón de radio con FormBuilder –

+2

. Solo quería decir que, como recién llegado a Rails, encontré esta respuesta uno al que sigo volviendo. Es el regalo que sigue dando. Bueno, hasta que recuerde la sintaxis correcta de todos modos ... :) –

+0

también verifique esto si está buscando establecer el valor 'checked' condicionalmente http://stackoverflow.com/a/4708921/429521 –

1

Si desea que el object_name prefijado a cualquier ID que debe llamar a los ayudantes de formulario en el formulario Objeto:

- form_for(@message) do |f| 
    = f.label :email 

Esto también permite asegurarse de que los datos presentados se almacena en la memoria debe haber algún error de validación, etc.

Si no puede llamar al método asistente de formulario en el objeto de formulario, por ejemplo, si estás usando un auxiliar de etiquetas (radio_button_tag etc.) se puede interpolar el nombre usando:

= radio_button_tag "#{f.object_name}[email]", @message.email 

En este caso lo que se necesita para especificar el valor manualmente para preservar cualquier presentación.

199

Pasando la opción :value-f.label se asegurará de atributo de la etiqueta etiqueta for es el mismo que el ID de la radio_button

<% form_for(@message) do |f| %> 
    <%= f.radio_button :contactmethod, 'email' %> 
    <%= f.label :contactmethod, 'Email', :value => 'email' %> 
    <%= f.radio_button :contactmethod, 'sms' %> 
    <%= f.label :contactmethod, 'SMS', :value => 'sms' %> 
<% end %> 

correspondiente Ver ActionView::Helpers::FormHelper#label

la opción: valor, que está diseñado para apuntar a las etiquetas para etiquetas de radio_button

+4

bueno, esto puede tener 0 votos porque fue contestado meses después, pero en realidad es el bueno. Advertencia: necesita Rails> = 2.3.3 – tokland

+0

Este método también representa el div 'field_with_errors' cuando es necesario (que no aparece cuando se utiliza el método': contactmethod_email').¡Esta es la respuesta correcta! – caesarsol

Cuestiones relacionadas