轨道形式的单选按钮的标签

时间:2009-04-14 04:52:50

标签: ruby-on-rails forms

我的问题类似于this one 但对于Rails应用程序。

我有一个带有一些单选按钮的表单,并希望将标签与它们相关联。 label表单助手只将表单字段作为参数,但在这种情况下,我有一个表单字段的多个单选按钮。我看到的唯一方法是手动创建标签,硬编码为单选按钮自动生成的ID。有谁知道更好的方法吗?

例如:

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

5 个答案:

答案 0 :(得分:214)

:value选项传递给f.label可确保标签标记的for属性与相应radio_button

的ID相同
<% 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

  

:value选项,用于定位radio_button标签的标签

答案 1 :(得分:136)

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

答案 2 :(得分:1)

如果您希望object_name前缀为任何ID,您应该在表单对象上调用表单助手:

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

如果存在任何验证错误等,这也可以确保任何提交的数据都存储在内存中。

如果您无法在表单对象上调用表单帮助程序方法,例如,如果您正在使用标记帮助程序(radio_button_tag等),则可以使用以下内容插入名称:

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

在这种情况下,您需要手动指定值以保留任何提交。

答案 3 :(得分: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)

答案 4 :(得分:0)

这是我的项目中使用radio按钮及其label进行评级的示例

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