ruby-on-rails - Simple_form : why two input tags are generated instead of one?

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

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

相关文章:

ruby-on-rails - 为什么 simple_form 为 NilClass :Class"? 引发 "undefined method ` model_name'

ruby-on-rails - 为什么check_box表单帮助程序会生成两个复选框,其中一个隐藏?

javascript - Rails - 使用ajax在div中显示show

ruby-on-rails - 将图像添加到 Rails 5.2 主动存储中的种子数据库

ruby-on-rails - session 变量存储在Rails中的什么位置?

ruby-on-rails - 如何使用 HAML 生成 simple_form View ?

ruby-on-rails - Rails简易表格国家/地区选择

ruby-on-rails - 在Rails中将自定义ID用于check_box_tag

php - 使用 CakePHP 表单助手在输入占位符上显示特殊字符

mysql - Rails Mysql::错误:查询:未连接 Windows 7