为什么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。
答案 0 :(得分:8)
check_box gotcha
http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-check_box
HTML规范说未选中的复选框不成功,因此Web浏览器不会发送它们。遗憾的是,这引入了一个问题:如果发票模型具有付费标记,并且在编辑付费发票的表单中,用户取消选中其复选框,则不会发送任何付费参数。所以,任何像
这样的质量分配习语@invoice.update(params[:invoice])
不会更新旗帜。
为了防止这种情况,帮助者在复选框之前生成辅助隐藏字段。 隐藏字段具有相同的名称,其属性模仿未选中的复选框。
这样,客户端只发送隐藏字段(表示未选中复选框)或两个字段。由于HTML规范说键/值对必须以它们在表单中出现的相同顺序发送,并且参数提取得到查询字符串中任何重复键的最后一次出现,这适用于普通表单。