ป้ายกำกับสำหรับปุ่มตัวเลือกในรูปแบบราง


147

คำถามของฉันคล้ายกับคำถามนี้ แต่สำหรับแอพ Rails

ฉันมีแบบฟอร์มที่มีปุ่มตัวเลือกและต้องการเชื่อมโยงป้ายกำกับกับพวกเขา ตัวlabelช่วยสร้างฟอร์มใช้เขตข้อมูลฟอร์มเป็นพารามิเตอร์เท่านั้น แต่ในกรณีนี้ฉันมีปุ่มตัวเลือกหลายปุ่มสำหรับเขตข้อมูลฟอร์มเดียว วิธีเดียวที่ฉันเห็นคือการสร้างป้ายกำกับด้วยตนเองเข้ารหัสรหัสที่สร้างขึ้นโดยอัตโนมัติสำหรับปุ่มตัวเลือก ไม่มีใครรู้วิธีที่ดีกว่าที่จะทำหรือไม่

ตัวอย่างเช่น:

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

สิ่งนี้สร้างสิ่งที่ชอบ:

<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

สิ่งที่ฉันต้องการ:

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

คำตอบ:


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

91
มีวิธีอื่นเช่นกัน: ผ่าน:valueตัวเลือกที่f.labelจะทำสิ่งเดียวกัน <%= f.label :contactmethod, 'SMS', :value => 'sms' %>เช่น การตั้งค่านี้ "สำหรับ" คุณลักษณะของแท็กฉลากอย่างถูกต้องซึ่งทำให้การคลิกที่ฉลากเลือกปุ่มตัวเลือกที่เหมาะสม ในคำตอบข้างต้นการใช้ตัวlabelช่วยจะทำให้แอตทริบิวต์ "สำหรับ" ไม่ถูกต้องเมื่อสร้างปุ่มตัวเลือกด้วย FormBuilder
John Douthat

2
ฉันแค่อยากจะบอกว่าในฐานะผู้มาใหม่กับ Rails ฉันได้พบคำตอบนี้ที่ฉันกลับมา มันเป็นของขวัญที่มอบให้อย่างต่อเนื่อง ดีจนกว่าฉันจะจำไวยากรณ์ที่เหมาะสมต่อไป ... :)
John Gallagher

ตรวจสอบสิ่งนี้หากคุณกำลังมองหาการตั้งcheckedค่าตามเงื่อนไขstackoverflow.com/a/4708921/429521
Felipe Sabino

8
สำหรับผู้อ่านในอนาคต John Douthat มีคำตอบที่ถูกต้องสำหรับคำถามนี้ คำตอบนี้ไม่ถูกต้องอีกต่อไป
superluminary

230

การส่งผ่าน:valueตัวเลือกเพื่อf.labelให้แน่ใจว่าforแอตทริบิวต์ของแท็กฉลากจะเหมือนกับ id ของที่เกี่ยวข้อง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 %>

ดูActionView :: Helpers :: FormHelper # label

ตัวเลือกค่า: ซึ่งออกแบบมาเพื่อกำหนดเป้าหมายป้ายกำกับสำหรับแท็ก radio_button


5
นี่อาจมี 0 โหวตเพราะได้รับคำตอบในเดือนต่อมา แต่จริงๆแล้วมันเป็นคะแนนที่ดี Caveat: คุณต้องการ Rails> = 2.3.3
tokland

3
วิธีนี้ยังแสดงผลfield_with_errorsdiv เมื่อจำเป็น (ซึ่งจะไม่ปรากฏขึ้นเมื่อใช้:contactmethod_emailวิธี) นี่คือคำตอบที่ถูกต้อง!
caesarsol

1

หากคุณต้องการให้ object_name นำหน้า ID ใด ๆ คุณควรเรียกผู้ช่วยฟอร์มบนวัตถุฟอร์ม:

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

นอกจากนี้ยังทำให้แน่ใจว่าข้อมูลที่ส่งใด ๆ ถูกเก็บไว้ในหน่วยความจำหากมีข้อผิดพลาดในการตรวจสอบความถูกต้อง ฯลฯ

หากคุณไม่สามารถเรียกเมธอดตัวช่วยฟอร์มบนวัตถุฟอร์มตัวอย่างเช่นถ้าคุณใช้ตัวช่วยแท็ก (radio_button_tag ฯลฯ ) คุณสามารถแทรกชื่อโดยใช้:

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

ในกรณีนี้คุณจะต้องระบุค่าด้วยตนเองเพื่อรักษาการส่งใด ๆ


0

การใช้true/ falseเป็นค่าจะมีฟิลด์ที่กรอกไว้ล่วงหน้าหากแบบจำลองที่ส่งไปยังแบบฟอร์มมีคุณลักษณะนี้แล้ว:

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

0

นี้คือตัวอย่างจากโครงการของฉันสำหรับการจัดอันดับโดยใช้radioปุ่มและ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>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.