验证接受总是失败

时间:2011-01-20 11:46:49

标签: ruby-on-rails validation

我看不出我错过了什么,但显然有些不对。

模特:

validates :terms, :acceptance => true, :on => :update

尝试几个选项:

>> a = Factory(:blog_agreement)
=> #<BlogAgreement id: 54, terms: false, created_at: "2011-01-20 11:33:03", updated_at: "2011-01-20 11:33:03", accept_code: "fa27698206bb15a6fba41857f12841c363c0e291", user_id: 874>

>> a.terms
=> false

>> a.terms = true
=> true
>> a.save
=> false

>> a.terms = "1"
=> "1"
>> a.save
=> false

>> a.terms = 1
=> 1
>> a.save
=> false
>> a.errors.full_messages
=> ["Terms must be accepted"]

8 个答案:

答案 0 :(得分:101)

更新了答案..

事实证明,问题是将术语作为表中的实际列。通常,validates_acceptance_of在没有这样的列的情况下使用,在这种情况下,它定义了一个属性访问器并将其用于其验证。

为了使validates_acceptance_of在映射到真实表列时起作用,必须传递:accept选项,如:

validates :terms, :acceptance => {:accept => true}

其原因与Active Record中的类型转换有关。当命名属性实际存在时,AR会根据数据库列类型执行类型转换。在大多数情况下,接受列将被定义为布尔值,因此model_object.terms将返回true或false。

当没有这样的列attr_accessor :terms时,只返回从params哈希传入模型对象的值,该哈希值通常是"1"来自复选框字段。

答案 1 :(得分:6)

如果有人和我一样有同样的问题,我会添加这个答案:

我加入了设计的注册表格:

<强> sign_up.html.erb

<%= f.check_box :terms_of_service %>

<强> user.rb

validates, :terms_of_service, acceptance: true

我忘记在我的configured_permitted_pa​​rameters中添加:terms_of_service并设计忽略了复选框状态。

<强> application_controller.rb

before_filter :configure_permitted_parameters, if: :devise_controller?

def configure_permitted_parameters
  devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:email, :password, :password_confirmation, :terms_of_service)}
end

设计使用 configure_permitted_pa​​rameters 方法了解除了电子邮件和密码之外应该保存哪些参数。

答案 2 :(得分:5)

我不得不使用这种格式:

validates :accpeted_terms, :acceptance => {:accept => true}

答案 3 :(得分:4)

validates_acceptance_of :terms, :accept => true

答案 4 :(得分:1)

我在上面找到了Candland的答案,证明在Rails 3.1中接受是正确的。这就是我设置Rails 3.1.3应用程序以记录对数据库的接受程度的方法。

在迁移中,

class AddTermsToAccount < ActiveRecord::Migration
  def change
    add_column :accounts, :terms_of_service, :boolean, :default => false
  end
end

在模型中,

attr_accessible :terms_of_service
validates :terms_of_service, :acceptance => {:accept => true}

在表格中,

<%= f.check_box :terms_of_service %>
<%= f.label :terms_of_service %>

答案 5 :(得分:1)

我已经从Angular JS和Rails 4中尝试了这个。带有true值的Angular send参数但rails无法识别true

  

它可以接收:accept选项,它决定了它的值   被视为接受。它默认为“1”并且可以很容易   改变。

所以,我改成了这个:

class Person < ActiveRecord::Base
  validates :terms_of_service, acceptance: { accept: true }
end

如果您的默认参数为10。尝试这样做:

class Person < ActiveRecord::Base
  validates :terms_of_service, acceptance: true
end

这是为了获得更多文档。 acceptance validation。 我希望这能帮到你。

答案 6 :(得分:0)

对工厂的调用会创建记录,因此您后续的保存调用实际上是更新,因此您的验证将按预期失败。在没有工厂的情况下尝试它,它应该工作。

答案 7 :(得分:0)

如果您的视图中有一个基本复选框,例如

<%= builder.check_box :agreement %>

将此行放入模型中

validates :agreement, :acceptance => true

使用check_box视图助手

生成的默认值“1”