2009-04-14 7 views
126

Ma question est similaire à this one mais pour une application Rails.Etiquettes pour boutons radio sous forme de rails

J'ai un formulaire avec quelques boutons radio, et je voudrais associer des étiquettes avec eux. L'aide de formulaire label prend seulement 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 de le faire est de créer manuellement une étiquette, codant en dur l'ID qui est généré automatiquement pour le bouton radio. Est-ce que quelqu'un sait d'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> 
+0

Merci votre question Le code d'instruction m'a aidé :) –

Répondre

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

Il y a une autre manière aussi: passer une option ': value' à' f.label' fera la même chose. par exemple. '<% = f.label: contactmethod, 'SMS',: value => 'sms'%>'. Ceci définit correctement l'attribut "for" de l'étiquette 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'aide 'label' provoquera l'erreur" for "lorsque le bouton radio est créé avec FormBuilder –

+2

Je voulais juste dire que comme nouveau venu sur Rails, j'ai trouvé cette réponse celui que je reviens à. C'est le cadeau qui continue à donner. Eh bien, jusqu'à ce que je me souviens de la syntaxe correcte de toute façon ... :) –

+0

également vérifier cela si vous cherchez à mettre la valeur 'checked' conditionnellement http://stackoverflow.com/a/4708921/429521 –

1

Si vous voulez que le object_name préfixé à un ID que vous devrait appeler des aides de forme sur le formulaire objet:

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

Cela rend également que les données soumises sont stockées dans la mémoire devrait y avoir des erreurs de validation, etc.

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

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

Dans ce cas, vous auriez besoin de spécifier la valeur manuellement pour préserver toutes les soumissions.

199

Passer l'option :value-f.label assurera l'attribut de balise label for est le même que l'identifiant du 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 %> 

Voir ActionView::Helpers::FormHelper#label

correspondant: option de valeur, qui est conçu pour cibler les étiquettes des étiquettes radio_button

+4

bien, cela peut avoir 0 votes parce qu'il a été répondu des mois plus tard, mais en fait c'est le bon. Avertissement: vous avez besoin de Rails> = 2.3.3 – tokland

+0

cette méthode rend également la div 'field_with_errors' quand c'est nécessaire (cela n'apparaît pas quand on utilise la méthode': contactmethod_email').c'est la bonne réponse! – caesarsol

Questions connexes