Etiquetas para botones de radio en forma de rieles

147

Mi pregunta es similar a esta, pero para una aplicación Rails.

Tengo un formulario con algunos botones de opción y me gustaría asociar etiquetas con ellos. El labelasistente de formulario 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 en que veo hacerlo es crear manualmente una etiqueta, codificando 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>
Bryan
fuente

Respuestas:

145
<% 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 %>
Matt Haley
fuente
9191
También hay otra forma: pasar una :valueopción a f.labelhará lo mismo. por ej <%= f.label :contactmethod, 'SMS', :value => 'sms' %>. Esto establece el atributo "for" de la etiqueta de etiqueta correctamente, lo que hace que al hacer clic en la etiqueta se seleccione el botón de opción apropiado. En la respuesta anterior, simplemente usar el labelayudante hará que el atributo "for" sea incorrecto cuando se cree el botón de opción con FormBuilder
John Douthat
2
Solo quería decir que, como recién llegado a Rails, he encontrado esta respuesta a la que siempre vuelvo. Es el regalo que sigue dando. Bueno, hasta que recuerde la sintaxis adecuada de todos modos ... :)
John Gallagher
también verifique esto si está buscando establecer el checkedvalor condicional stackoverflow.com/a/4708921/429521
Felipe Sabino
8
Para futuros lectores, John Douthat tiene la respuesta correcta a esta pregunta. Esta respuesta ya no es correcta.
superluminary
230

Al pasar la :valueopción a, f.labelse asegurará de que el foratributo de la etiqueta de etiqueta sea ​​el mismo que el ID del correspondienteradio_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 %>

Ver ActionView :: Helpers :: FormHelper # label

la opción: value, que está diseñada para etiquetas de destino para etiquetas radio_button

John Douthat
fuente
55
bueno, esto puede tener 0 votos porque fue respondido meses después, pero en realidad es el bueno. Advertencia: necesitas rieles> = 2.3.3
tokland
3
Este método también representa el field_with_errorsdiv cuando es necesario (que no aparece cuando se usa el :contactmethod_emailmétodo). ¡Esta es la respuesta correcta!
caesarsol
1

Si desea que el object_name tenga el prefijo de cualquier ID, debe llamar a los ayudantes de formulario en el objeto de formulario:

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

Esto también asegura que los datos enviados se almacenen en la memoria en caso de que haya errores de validación, etc.

Si no puede llamar al método de ayuda de formulario en el objeto de formulario, por ejemplo, si está usando una etiqueta de ayuda (radio_button_tag, etc.) puede interpolar el nombre usando:

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

En este caso, deberá especificar el valor manualmente para preservar cualquier envío.

James Conroy-Finn
fuente
0

Al usar true/ falsecomo valor, el campo se completará previamente si el modelo pasado al formulario ya tiene este atributo completado:

= f.radio_button(:public?, true)
= f.label(:public?, "yes", value: true)
= f.radio_button(:public?, false)
= f.label(:public?, "no", value: false)
localhostdotdev
fuente
0

Este es un ejemplo de mi proyecto para calificar usando radiobotones y su labels

<div class="rating">
  <%= form.radio_button :star, '1' %>
  <%= form.label :star, '☆', value: '1' %>

  <%= form.radio_button :star, '2' %>
  <%= form.label :star, '☆', value: '2' %>

  <%= form.radio_button :star, '3' %>
  <%= form.label :star, '☆', value: '3' %>

  <%= form.radio_button :star, '4' %>
  <%= form.label :star, '☆', value: '4' %>

  <%= form.radio_button :star, '5' %>
  <%= form.label :star, '☆', value: '5' %>
</div>
desaparecido en combate
fuente