【发布时间】:2017-09-17 20:27:50
【问题描述】:
<%= form_for list do |f| %> <!-- This might be an issue in production mode -->
<%= f.fields_for l = list.list_items.build, index: l.id do |list_item| %>
<td><%= list_item.check_box :user_item_id, { checked: false, include_hidden: false }, item.id, "nil" %></td> <!-- checkboxes seem problematic, try check_box_tag? -->
<td><%= item.name %></td>
<td>$<%= number_with_precision(item.price, :precision => 2) %></td>
<td><%= list_item.number_field :quantity,
min: 1,
class: "num"%></td>
<% end %>
<% end %>
如果我的页面上有三个,并且所有三个都被选中,Rails 将为每个表单发送一个额外的未选中值。这是为什么呢?
Parameters: {"utf8"=>"✓", "authenticity_token"=>"sn2HLFvVLX7ZFxBTHvRGz25H+bbyiVl8E8Kok5J7788q8WA33U8RpWmLXjU2GTjD2ybW7RMaiX1CwLJ6oCLXmQ==", "list"=>{"list_item"=>[{"user_item_id"=>"nil"}, {"user_item_id"=>"19", "quantity"=>"1"}, {"user_item_id"=>"nil"}, {"user_item_id"=>"20", "quantity"=>"2"}, {"user_item_id"=>"nil"}, {"user_item_id"=>"21", "quantity"=>"3"}], "name"=>""}, "commit"=>"Create List"}
但是,如果我关闭隐藏字段,当前面的框未选中时,我的表单会“窃取”彼此的数据,我会遇到其他问题。例如这里我没有选中第一个表单:
参数:{"utf8"=>"✓", "authenticity_token"=>"qszyk+q+pJ77WuDh2/K2S8lTuBD99DptwqeEdDI4U+4yQBWIbCSYRUvGrofzH8hHfDKXSxxn6myTpZ6dAGFruA==", "list"=>{"list_item"=>[{"quantity" =>"1", "user_item_id"=>"20"}, {"quantity"=>"2", "user_item_id"=>"21"}, {"quantity"=>"3"}], "name "=>""}, "commit"=>"创建列表"}
请注意第一个未选中的表单如何忽略将 user_item_id 设置为“nil”,而是完全忽略了参数并窃取了下一个表单的 user_item_id,从而弄乱了我的数量值(我设置为与以前相同)。
这是为什么?
PS:我最初的“nil”只是 nil,但这样做可以防止在任何情况下传递未经检查的值,并且我遇到了表单相互窃取值的问题,就像我在上面发布的那样。如果有人能告诉我如何做到这一点,那么未选中的框意味着我的 fields_for 将不会被提交,那就太好了。
【问题讨论】:
标签: ruby-on-rails forms checkbox