在我的模型中,我有以下验证器:
validates :terms, acceptance: true, on: :create, allow_nil: false
attr_accessor :terms
以我的形式,我有:
= simple_form_for @reservation do |f|
= f.error_notification
= f.input :terms, as: :boolean
问题在于,当用户不接受不显示任何错误的条款时,为什么?
答案 0 :(得分:6)
试试这个:
validates :terms, :acceptance => {:accept => true} , on: :create, allow_nil: false
答案 1 :(得分:5)
问题可能会将术语作为表中的实际列。通常,validates_acceptance_of在没有这样的列的情况下使用,在这种情况下,它定义了一个属性访问器并将其用于其验证。
为了使validates_acceptance_of在映射到真实表列时起作用,必须传递:accept选项,如:
validates :terms, :acceptance => {:accept => true} , :on => :create , allow_nil: false
其原因与Active Record中的类型转换有关。当命名属性实际存在时,AR会根据数据库列类型执行类型转换。在大多数情况下,接受列将被定义为布尔值,因此model_object.terms
将返回true或false。
当没有这样的列attr_accessor :terms
时,只返回从params散列传入模型对象的值,该散列通常是"1"
来自复选框。
通过noodl
答案 2 :(得分:2)
我可能遇到过类似的问题(Rails 4.2.0)。我创建了一个复选框,但它会被忽略,如果未选中则永远不报告和错误。我发现将参数添加到Strong Parameters的.permit
部分允许它出现。
在我的_form
视图模板中,我有类似的内容:
<div class="field">
<%= label_tag :tos, 'I accepts the TOS' %><br>
<%= f.check_box :tos %>
</div>
我使用scaffold生成了我的模型,因此我的create
方法就像这样开始
def create
@thing = Thing.new(thing_params)
然后靠近底部我有以下thing_params
def thing_params
params.require(:thing).permit(:field1, :field2, :tos)
end
在我的模型中,我使用了以下内容:
validates_acceptance_of :tos
如果我遗漏&#39;:tos like this
params.require(:thing).permit(:field1,:field2),它不会弹出错误并允许它继续。这似乎是违反直觉的,因为如果Strong Parameters正在删除:tos字段,那么我认为validate_acceptance会失败。
我最初只是在不使用f.check_box
的情况下创建了一个复选框。现在,如果我甚至尝试在没有new
&#34;的情况下拨打:tos
路线被列为允许,rails引发错误。似乎还有一些rails魔法正在进行,因为如果我从模型中移除validates_acceptance_of
,我在渲染我的视图时会收到NoMethodError
错误,说undefined method
tos&#39;`线
<%= f.check_box :tos %>
如果其他人可以解释究竟发生了什么,那将是很棒的,因为我只是通过谷歌搜索和猜测一起攻击它。