web-dev-qa-db-fra.com

Les étiquettes pour les boutons radio dans Rails form

Ma question est similaire à celle-ci mais pour un Rails app.

J'ai un formulaire avec des boutons radio et j'aimerais y associer des étiquettes. L'assistant de formulaire label 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 pour moi de le faire est de créer manuellement une étiquette, en codant en dur l'ID généré automatiquement pour le bouton radio. Est-ce que quelqu'un connaît 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>
141
Bryan
<% 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 %>
139
Matt Haley

En passant le :value option à f.label s'assurera que l'attribut for de la balise est identique à l'id 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

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

218
John Douthat

Si vous souhaitez que le nom d'objet soit préfixé par un ID, vous devez appeler des 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'erreur 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 un assistant de balise (radio_button_tag, etc.), vous pouvez interpoler le nom à l'aide de:

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

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

1
James Conroy-Finn

En utilisant true/false comme valeur, le champ sera pré-rempli si le modèle transmis 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)
0
localhostdotdev