Label untuk tombol radio dalam bentuk rel

147

Pertanyaan saya mirip dengan yang satu ini tetapi untuk aplikasi Rails.

Saya memiliki formulir dengan beberapa tombol radio, dan ingin menghubungkan label dengan mereka. The labelbentuk helper hanya membutuhkan formulir isian sebagai parameter, tetapi dalam hal ini saya memiliki beberapa tombol radio untuk bidang bentuk tunggal. Satu-satunya cara yang saya lihat untuk melakukannya adalah secara manual membuat label, mengkodekan keras ID yang dihasilkan secara otomatis untuk tombol radio. Adakah yang tahu cara yang lebih baik untuk melakukannya?

Sebagai contoh:

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

Ini menghasilkan sesuatu seperti:

<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

Apa yang saya inginkan:

<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
sumber

Jawaban:

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
sumber
91
Ada cara lain juga: melewati :valueopsi untuk f.labelakan melakukan hal yang sama. mis <%= f.label :contactmethod, 'SMS', :value => 'sms' %>. Ini mengatur atribut "untuk" dari label label dengan benar, yang membuat mengklik label memilih tombol radio yang sesuai. Dalam jawaban di atas, hanya menggunakan labelhelper akan menyebabkan atribut "for" salah ketika tombol radio dibuat dengan FormBuilder
John Douthat
2
Saya hanya ingin mengatakan bahwa sebagai pendatang baru di Rails, saya telah menemukan jawaban ini yang terus saya kembalikan. Ini adalah hadiah yang terus memberi. Ya, sampai saya ingat sintaks yang tepat ... :)
John Gallagher
juga periksa ini jika Anda mencari pengaturan checkednilai stackoverflow.com/a/4708921/429521
Felipe Sabino
8
Untuk pembaca masa depan, John Douthat memiliki jawaban yang benar untuk pertanyaan ini. Jawaban ini tidak lagi benar.
superluminary
230

Melewati :valueopsi untuk f.labelmemastikan foratribut label label sama dengan id yang terkaitradio_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 %>

Lihat label ActionView :: Helpers :: FormHelper #

opsi: value, yang dirancang untuk menargetkan label untuk tag radio_button

John Douthat
sumber
5
baik, ini mungkin memiliki 0 suara karena dijawab berbulan-bulan kemudian, tetapi sebenarnya itu yang bagus. Peringatan: Anda memerlukan Rails> = 2.3.3
tokland
3
metode ini juga membuat field_with_errorsdiv bila perlu (itu tidak muncul saat menggunakan :contactmethod_emailmetode). ini jawaban yang benar!
caesarsol
1

Jika Anda ingin agar object_name diawali dengan ID apa pun, Anda harus memanggil form helpers pada objek form:

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

Ini juga memastikan setiap data yang dikirimkan disimpan dalam memori jika ada kesalahan validasi, dll.

Jika Anda tidak bisa memanggil metode form helper pada objek form, misalnya jika Anda menggunakan tag helper (radio_button_tag, dll.) Anda bisa menginterpolasi nama menggunakan:

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

Dalam hal ini, Anda harus menentukan nilai secara manual untuk menyimpan kiriman apa pun.

James Conroy-Finn
sumber
0

Menggunakan true/ falsesebagai nilai akan memiliki bidang diisi sebelumnya jika model yang dikirimkan ke formulir memiliki atribut ini sudah diisi:

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

Ini contoh dari proyek saya untuk rating menggunakan radiotombol dan 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
sumber