Étiquettes pour boutons radio sous forme de rails

147

Ma question est similaire à celle-ci mais pour une application Rails.

J'ai un formulaire avec des boutons radio et j'aimerais y associer des étiquettes. L' labelassistant de formulaire prend uniquement un champ de formulaire en tant que paramètre, mais dans ce cas, j'ai plusieurs boutons radio pour un seul champ de formulaire. La seule façon que je vois pour le faire est de créer manuellement une étiquette, en codant en dur l'ID qui est généré automatiquement pour le bouton radio. Quelqu'un connaît-il une meilleure façon de le faire?

Par exemple:

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

Cela génère quelque chose comme:

<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

Ce que je veux:

<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
la source

Réponses:

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
la source
91
Il existe une autre solution: passer une :valueoption à f.labelfera la même chose. par exemple <%= f.label :contactmethod, 'SMS', :value => 'sms' %>. Cela définit correctement l'attribut "pour" de la balise d'étiquette, ce qui fait que cliquer sur l'étiquette sélectionne le bouton radio approprié. Dans la réponse ci-dessus, le simple fait d'utiliser l' labelassistant rendra l'attribut «for» incorrect lorsque le bouton radio est créé avec FormBuilder
John Douthat
2
Je voulais juste dire qu'en tant que nouveau venu chez Rails, j'ai trouvé cette réponse à laquelle je reviens sans cesse. C'est le cadeau qui continue de donner. Eh bien, jusqu'à ce que je me souvienne de la syntaxe appropriée de toute façon ... :)
John Gallagher
Vérifiez également ceci si vous cherchez à définir la checkedvaleur conditionnellement stackoverflow.com/a/4708921/429521
Felipe Sabino
8
Pour les futurs lecteurs, John Douthat a la bonne réponse à cette question. Cette réponse n'est plus correcte.
superluminaire
230

Le fait de passer l' :valueoption à f.labelgarantira que l' forattribut de la balise d'étiquette est le même que l'id du correspondantradio_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 %>

Voir ActionView :: Helpers :: FormHelper # label

l'option: value, conçue pour cibler les étiquettes des balises radio_button

John Douthat
la source
5
eh bien, cela peut avoir 0 voix car il a été répondu des mois plus tard, mais en fait, c'est la bonne. Avertissement: vous avez besoin de Rails> = 2.3.3
tokland
3
cette méthode rend également le field_with_errorsdiv si nécessaire (cela n'apparaît pas lors de l'utilisation de la :contactmethod_emailméthode). c'est la bonne réponse!
caesarsol
1

Si vous voulez que le nom de l'objet soit préfixé à n'importe quel ID, vous devez appeler les assistants de formulaire sur l'objet de formulaire:

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

Cela garantit également que toutes les données soumises sont stockées en mémoire en cas d'erreurs de validation, etc.

Si vous ne pouvez pas appeler la méthode d'assistance de formulaire sur l'objet de formulaire, par exemple si vous utilisez une aide de balise (radio_button_tag etc.), vous pouvez interpoler le nom en utilisant:

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

Dans ce cas, vous devez spécifier la valeur manuellement pour conserver toutes les soumissions.

James Conroy-Finn
la source
0

En utilisant true/ falsecomme valeur, le champ sera pré-rempli si le modèle passé au formulaire a cet attribut déjà rempli:

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

Ceci est un exemple de mon projet d'évaluation à l'aide de radioboutons et de ses 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>
MIA
la source