我有一个用户模型。每个用户has_one
包。
在用户表单上,我将包选项呈现为单选按钮:
<% Package.all.each do |p| %>
<div class="switch-field">
<%= radio_button_tag('package[id]', p.id) %>
<%= label_tag("package_#{p.id}", number_to_currency(p.price)) %>
</div>
<% end %>
但无法点击按钮。如果我将标记行更改为此 - 删除[id]:
<% Package.all.each do |p| %>
<div class="switch-field">
<%= radio_button_tag('package', p.id) %>
<%= label_tag("package_#{p.id}", number_to_currency(p.price)) %>
</div>
<% end %>
然后可以点击它们。
然而,这提交给控制器为“package”=&gt;“1”,而第一个示例提交为用户内部的嵌套对象,如下所示:
"user"=>{..user field.., "package"=>{"id"=>"6"}}
我希望这是Rails提交数据的方式(控制器有这个:
wrap_parameters :user, include: [:event, :package]
那么如何使用“package [id]”作为组的名称来使用单选按钮?
答案 0 :(得分:1)
这里的问题只是radio_button_tag
的生成ID与label_tag
传递的内容之间的不匹配。你有几个方法可以解决这个问题。
使用您的代码查看页面的html,单选按钮的ID为"package_id_0"
,而不是"package_0"
,因此我们只需更新label_tag
,如下所示:
<% 3.times do |x| %>
<div class="switch-field">
<%= radio_button_tag('package[id]', x) %>
<%= label_tag("package_id_#{x}", number_to_currency(x * 1.50)) %>
</div>
<% end %>
如果您想要"package_0"
代替"package_id_0"
,可以将其传递到radio_button_tag
<% 3.times do |x| %>
<div class="switch-field">
<%= radio_button_tag('package[id]', x, false, id: "package_#{x}") %>
<%= label_tag("package_#{x}", number_to_currency(x * 1.50)) %>
</div>
<% end %>
我更喜欢以这种方式做事,因为它更容忍击中标签周围的空白并且通常提供更大的“命中框”。我在文本周围添加了一个带有类的跨度,以防需要样式化。
<% 3.times do |x| %>
<div class="switch-field">
<%= label_tag do %>
<%= radio_button_tag('package[id]', x) %>
<%= content_tag(:span, number_to_currency(x * 1.50), class: 'label') %>
<% end %>
</div>
<% end %>