7

为什么 simple_form 为布尔字段生成两次输入标签(一个隐藏而另一个不)?

在我的 simple_form 中,我有这个:

<%= form.input :over_phone, as: :boolean, input_html: {checked: true} %>

这会产生:

<div class="control-group boolean optional order_over_phone">
  <label class="boolean optional control-label" for="order_over_phone">Order over phone</label>
  <div class="controls">
    <input name="order[over_phone]" type="hidden" value="0">
    <label class="checkbox">
      <input checked="checked" class="boolean optional" id="order_over_phone" name="order[over_phone]" type="checkbox" value="1">
    </label>
  </div>
</div>

如您所见,一个输入标签被隐藏,值为 0,另一个未隐藏,值为 1。如果我提交表单,在 post 参数中我得到两个值:

order[over_phone]:0
order[over_phone]:1

我在与这个布尔字段相关的模型创建中有一些随机行为,所以我想知道它是否是由 simple_form 引起的。非布尔字段类型不会发生这种情况。

如果您遇到过类似的问题,请分享您的经验。

我正在使用 simple_form 2.1.0。

4

1 回答 1

9

复选框陷阱

http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-check_box

HTML 规范说未选中的复选框是不成功的,因此 Web 浏览器不会发送它们。不幸的是,这引入了一个陷阱:如果一个 Invoice 模型有一个付费标志,并且在编辑付费发票的表单中,用户取消选中它的复选框,则不会发送付费参数。所以,任何像

@invoice.update(params[:invoice])

不会更新标志。

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

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

于 2013-09-27T11:49:11.100 回答