Rails形式的单选按钮标签


147

我的问题类似于问题, 但涉及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>

Answers:


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' %>。这样可以正确设置标签标记的“ for”属性,这使得单击标签可以选择适当的单选按钮。在上面的答案中,label当使用FormBuilder创建单选按钮时,仅使用助手将导致“ for”属性不正确
John

2
我只是想说一下,作为Rails的新手,我已经找到了这个答案,我一直在回头。这是不断给予的礼物。好吧,直到我仍然记得正确的语法... :)
John Gallagher

如果您要checked有条件地设置该值,也请检查一下stackoverflow.com/a/4708921/429521
Felipe Sabino 2012年

8
对于将来的读者,约翰·杜塔(John Douthat)对这个问题有正确的答案。这个答案不再正确。
superluminary 2014年

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

:value选项,用于定位单选按钮标签的标签


5
好吧,这可能是0票,因为几个月后才得到答复,但这实际上是好票。注意:您需要Rails> = 2.3.3
tokland 2010年

3
该方法还会field_with_errors在必要时渲染div(使用该:contactmethod_email方法时不会显示)。这是正确的答案!
caesarsol 2014年

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按钮和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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.