为什么 simple_form 为 bool 字段生成两次输入标签(一个隐藏,另一个不隐藏)?
在我的 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
我在与这个 bool 字段相关的模型创建中有一些随机行为,所以我想知道它是否是由 simple_form 引起的。非 bool 字段类型不会发生这种情况。
如果您遇到过类似的问题,请分享您的经验。
我正在使用 simple_form 2.1.0。
最佳答案
复选框问题
http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-check_box
HTML 规范说未选中的复选框不成功,因此 Web 浏览器不会发送它们。不幸的是,这引入了一个问题:如果发票模型具有已付标志,并且在编辑已付发票的表单中,用户取消选中其复选框,则不会发送已付参数。所以,任何大规模分配习语,如
@invoice.update(params[:invoice])
不会更新标志。
为了防止这种情况,助手生成一个 辅助隐藏域在非常复选框之前。 隐藏字段具有相同的名称,其属性模拟未选中的复选框。
这样,客户端要么只发送 隐藏字段 (表示复选框未选中),或两个字段。由于 HTML 规范规定键/值对必须按照它们在表单中出现的相同顺序发送,并且参数提取获取查询字符串中任何重复键的最后一次出现,这适用于普通表单。
关于ruby-on-rails - Simple_form : why two input tags are generated instead of one?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19049296/