Nhãn cho các nút radio ở dạng đường ray


147

Câu hỏi của tôi tương tự như câu hỏi này nhưng đối với ứng dụng Rails.

Tôi có một biểu mẫu với một số nút radio và muốn liên kết nhãn với chúng. Trình labeltrợ giúp biểu mẫu chỉ lấy một trường biểu mẫu làm tham số, nhưng trong trường hợp này tôi có nhiều nút radio cho một trường biểu mẫu. Cách duy nhất tôi thấy để làm điều đó là tạo nhãn thủ công, mã hóa cứng ID được tạo tự động cho nút radio. Có ai biết một cách tốt hơn để làm điều đó?

Ví dụ:

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

Điều này tạo ra một cái gì đó như:

<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

Những gì tôi muốn:

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

Câu trả lời:


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
Cũng có một cách khác: thông qua một :valuetùy chọn f.labelsẽ làm điều tương tự. ví dụ <%= f.label :contactmethod, 'SMS', :value => 'sms' %>. Điều này đặt thuộc tính "cho" của thẻ nhãn chính xác, làm cho việc nhấp vào nhãn chọn nút radio thích hợp. Trong câu trả lời ở trên, chỉ cần sử dụng trình labeltrợ giúp sẽ khiến thuộc tính "for" không chính xác khi nút radio được tạo bằng FormBuilder
John Douthat

2
Tôi chỉ muốn nói rằng với tư cách là người mới đến với Rails, tôi đã tìm thấy câu trả lời này cho câu trả lời mà tôi tiếp tục quay lại. Đó là món quà không ngừng đưa ra. Chà, cho đến khi tôi vẫn nhớ cú pháp thích hợp ... :)
John Gallagher

cũng kiểm tra điều này nếu bạn đang tìm cách thiết lập checkedgiá trị theo điều kiện stackoverflow.com/a/4708921/429521
Felipe Sabino

8
Đối với độc giả tương lai, John Douthat có câu trả lời chính xác cho câu hỏi này. Câu trả lời này không còn đúng nữa.
siêu sáng

230

Vượt qua :valuetùy chọn để f.labelđảm bảo forthuộc tính của thẻ nhãn giống với id của tương ứngradio_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 %>

Xem ActionView :: Helpers :: FormHelper # nhãn

tùy chọn: value, được thiết kế để nhắm mục tiêu nhãn cho thẻ radio_button


5
tốt, điều này có thể có 0 phiếu vì nó đã được trả lời nhiều tháng sau đó, nhưng thực sự nó là một phiếu tốt.
Hãy cẩn thận

3
phương thức này cũng hiển thị field_with_errorsdiv khi cần thiết (không hiển thị khi sử dụng :contactmethod_emailphương thức). Đây là câu trả lời chính xác!
caesarsol

1

Nếu bạn muốn object_name được thêm tiền tố vào bất kỳ ID nào, bạn nên gọi người trợ giúp biểu mẫu trên đối tượng biểu mẫu:

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

Điều này cũng đảm bảo mọi dữ liệu đã gửi được lưu trữ trong bộ nhớ nếu có bất kỳ lỗi xác thực nào, v.v.

Nếu bạn không thể gọi phương thức trình trợ giúp biểu mẫu trên đối tượng biểu mẫu, ví dụ: nếu bạn đang sử dụng trình trợ giúp thẻ (radio_button_tag, v.v.), bạn có thể nội suy tên bằng cách sử dụng:

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

Trong trường hợp này, bạn cần chỉ định giá trị theo cách thủ công để duy trì bất kỳ nội dung gửi nào.


0

Sử dụng true/ falselàm giá trị sẽ có trường được điền sẵn nếu mô hình được truyền cho biểu mẫu đã được điền thuộc tính này:

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

0

Đây là một ví dụ từ dự án của tôi để đánh giá bằng các radionút và labels của nó

<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>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.