Etykiety przycisków radiowych w postaci szyn

147

Moje pytanie jest podobne do tego, ale dotyczy aplikacji Rails.

Mam formularz z kilkoma przyciskami opcji i chciałbym skojarzyć z nimi etykiety. labelPostać pomocnika zajmuje tylko pole formularza jako parametr, ale w tym przypadku mam kilka przycisków opcji dla pojedynczego pola formularza. Jedynym sposobem, w jaki mogę to zrobić, jest ręczne utworzenie etykiety i zakodowanie identyfikatora, który jest generowany automatycznie dla przycisku opcji. Czy ktoś zna lepszy sposób na zrobienie tego?

Na przykład:

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

To generuje coś takiego:

<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

Czego chcę:

<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
źródło

Odpowiedzi:

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
źródło
91
Jest też inny sposób: przekazanie :valueopcji f.labelspowoduje to samo. np <%= f.label :contactmethod, 'SMS', :value => 'sms' %>. Spowoduje to prawidłowe ustawienie atrybutu „for” znacznika etykiety, co powoduje, że kliknięcie etykiety powoduje wybranie odpowiedniego przycisku opcji. W powyższej odpowiedzi użycie labelpomocnika spowoduje, że atrybut „for” będzie niepoprawny, gdy przycisk opcji zostanie utworzony za pomocą programu FormBuilder
John Douthat,
2
Chciałem tylko powiedzieć, że jako nowicjusz w Railsach znalazłem tę odpowiedź, do której ciągle wracam. To prezent, który ciągle daje. Cóż, póki nie pamiętam właściwej składni ... :)
John Gallagher
sprawdź również to, jeśli szukasz checkedwarunkowego ustawienia wartości stackoverflow.com/a/4708921/429521
Felipe Sabino
8
Dla przyszłych czytelników, John Douthat ma poprawną odpowiedź na to pytanie. Ta odpowiedź nie jest już poprawna.
superluminary
230

Przekazanie :valueopcji f.labelzapewni, że foratrybut tagu etykiety będzie taki sam, jak identyfikator odpowiedniegoradio_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 %>

Zobacz etykietę ActionView :: Helpers :: FormHelper #

opcja: value, która jest przeznaczona do kierowania etykiet dla tagów radio_button

John Douthat
źródło
5
cóż, może mieć 0 głosów, ponieważ odpowiedź została udzielona kilka miesięcy później, ale w rzeczywistości jest to dobry. Uwaga: potrzebujesz Rails> = 2.3.3
tokland
3
ta metoda renderuje również field_with_errorsdiv, gdy jest to konieczne (które nie są wyświetlane podczas korzystania z :contactmethod_emailmetody). to jest poprawna odpowiedź!
Caesarsol
1

Jeśli chcesz, aby nazwa_obiektu poprzedzona była dowolnym identyfikatorem, powinieneś wywołać pomocników formularzy na obiekcie formularza:

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

Daje to również pewność, że wszelkie przesłane dane są przechowywane w pamięci na wypadek błędów walidacji itp.

Jeśli nie możesz wywołać metody pomocnika formularza na obiekcie formularza, na przykład jeśli używasz pomocnika tagów (radio_button_tag itp.), Możesz interpolować nazwę za pomocą:

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

W takim przypadku musisz ręcznie określić wartość, aby zachować wszelkie przesłane materiały.

James Conroy-Finn
źródło
0

Użycie true/ falsejako wartości spowoduje, że pole będzie wstępnie wypełnione, jeśli model przekazany do formularza ma już wypełniony ten atrybut:

= f.radio_button(:public?, true)
= f.label(:public?, "yes", value: true)
= f.radio_button(:public?, false)
= f.label(:public?, "no", value: false)
localhostdotdev
źródło
0

To przykład z mojego projektu do oceniania za pomocą radioprzycisków i jego 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
źródło