【问题标题】:checkbox helper sending an extra param?复选框助手发送额外的参数?
【发布时间】: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


    【解决方案1】:

    这是由 rails 完成的,以便在未选中复选框时发送正确的值。

    当您不选中复选框时,隐藏字段的值(由复选框助手添加)会到达您的服务器,因为浏览器不会发送未选中的复选框。

    另一方面,当您检查它时,最后一个具有相同名称的值获胜,这意味着检查的值将被发送到服务器,一切都会按您的预期工作。

    来自documentation

    知道了

    HTML 规范说未选中的复选框不成功, 因此网络浏览器不会发送它们。不幸的是,这引入了 一个陷阱:如果一个发票模型有一个付费标志,并且形式为 编辑已付款发票 用户取消选中其复选框,未付款 参数发送。所以,任何像 @invoice.update(params[:invoice]) 不会更新标志。

    为了防止这种情况,助手在之前生成一个辅助隐藏字段 非常复选框。隐藏字段具有相同的名称及其 属性模仿未选中的复选框。

    这样,客户端要么只发送隐藏字段(代表 复选框未选中),或两个字段。由于 HTML 规范说键/值对必须以相同的顺序发送 它们出现在表单中,参数提取排在最后 查询字符串中出现任何重复键,适用于 普通形式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-12
      • 2021-07-21
      • 1970-01-01
      • 2014-07-10
      相关资源
      最近更新 更多