验证接受总是失败

use*_*874 31 validation ruby-on-rails

我看不出我错过了什么,但显然是不对的.

在模型中:

validates :terms, :acceptance => true, :on => :update
Run Code Online (Sandbox Code Playgroud)

尝试一些选择:

>> 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"]
Run Code Online (Sandbox Code Playgroud)

noo*_*odl 103

更新的答案..

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

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

validates :terms, :acceptance => {:accept => true}
Run Code Online (Sandbox Code Playgroud)

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

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


小智 7

如果有人像我一样有设计问题,我添加这个答案:

我加入了设计的注册表:

sign_up.html.erb

<%= f.check_box :terms_of_service %>
Run Code Online (Sandbox Code Playgroud)

user.rb

validates, :terms_of_service, acceptance: true
Run Code Online (Sandbox Code Playgroud)

我忘了在我的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
Run Code Online (Sandbox Code Playgroud)

configure_permitted_pa​​rameters方法是通过设计一种知道PARAMS他应该是保存除了电子邮件和密码的使用.


Can*_*and 5

我不得不使用这种格式:

validates :accpeted_terms, :acceptance => {:accept => true}
Run Code Online (Sandbox Code Playgroud)