Rails 5.1 radio_button_tag可防止点击按钮

时间:2017-07-20 07:23:54

标签: ruby-on-rails radio-button

我有一个用户模型。每个用户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]”作为组的名称来使用单选按钮?

1 个答案:

答案 0 :(得分:1)

这里的问题只是radio_button_tag的生成ID与label_tag传递的内容之间的不匹配。你有几个方法可以解决这个问题。

选项1 - 快速修复

使用您的代码查看页面的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 %>

选项2 - 更新单选按钮

如果您想要"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 - 使用块标签标签

我更喜欢以这种方式做事,因为它更容忍击中标签周围的空白并且通常提供更大的“命中框”。我在文本周围添加了一个带有类的跨度,以防需要样式化。

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