Simple_form:为什么生成两个输入标签而不是一个?

时间:2013-09-27 11:12:25

标签: ruby-on-rails simple-form form-helpers

为什么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。

1 个答案:

答案 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规范说键/值对必须以它们在表单中出现的相同顺序发送,并且参数提取得到查询字符串中任何重复键的最后一次出现,这适用于普通表单。