2013-09-27 24 views
7

为什么simple_form为布尔字段生成两次输入标签(一个隐藏,另一个不是)?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. 如果我提交表单,在发布参数中我会得到两个值:

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

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

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

我正在使用simple_form 2.1.0。

回答

8

check_box疑难杂症

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

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

@invoice.update(params[:invoice]) 

不会更新标志的任何大规模分配成语。

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

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

+0

非常感谢!这解释了它。我只是想通了,我的问题与“over_phone”字段是别的地方。 – Nurbo

相关问题