验证:条款,接受:真实不显示错误

时间:2014-06-16 05:38:08

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

在我的模型中,我有以下验证器:

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 

问题在于,当用户不接受不显示任何错误的条款时,为什么?

3 个答案:

答案 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 %>

如果其他人可以解释究竟发生了什么,那将是很棒的,因为我只是通过谷歌搜索和猜测一起攻击它。