在simple_form中,如果禁用该字段,则无法将boolean作为radio_button提交

时间:2013-12-19 15:19:41

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2 simple-form

我正在使用simple_form 2.0。我有一个布尔字段'stock',我试图将其作为单选按钮提交。

<%= f.input :stock , :as => :radio_buttons, :collection => [['Purchase Indent', false],
['Stock', true]], label:"Shipments From" , :disabled => true%>

在呈现表单之前,股票被标记为假。

Before submitting the form

我提交表单后,参数中缺少库存本身,我收到此错误。

After submitting the form.

因为我正在验证股票的包含。

validates_inclusion_of :stock, :in => [true, false]

如果我不禁用该字段,它可以正常工作。但我不希望用户能够改变它。 请帮忙。

更新

原因是,永远不会发送已停用的字段。
http://www.w3.org/TR/html401/interact/forms.html#h-17.12

似乎将其设为只读会有所帮助 https://github.com/plataformatec/simple_form/pull/367

但是,新闻是收音机按钮不能只读。
Why can't radio buttons be "readonly"?

2 个答案:

答案 0 :(得分:1)

一个选项是分隔按钮并仅禁用未选择的选项:

<%= f.input :stock , :as => :radio_buttons, collection: [['Purchase Indent', false]], label:"Shipments From" %>
<%= f.input :stock , :as => :radio_buttons, collection: [['Stock', true]], label:"" , :disabled => true %>

另一种选择是添加具有所需值的隐藏输入。

答案 1 :(得分:1)

切记不要信任用户提交的数据。 我不认为你应该像这样构建它,因为即使你禁用了表单元素,黑客也可以改变HTML /提交一个人工请求。隐藏的表单元素不能解决这个问题,因为任何拥有dom explorer的人都可以更改这些值。当然,如果你的模型检查并拒绝这种事情,那不是一个大问题。

因此,要修复特定问题,只需按原样执行视觉效果,然后在控制器的更新或创建操作中重新插入预期值。

如需了解更多信息,请联系我们。 owasp,但几年前谷歌的一些人喜欢“如何破解网络软件”这本书。