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_parameters中添加: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_parameters方法是通过设计一种知道PARAMS他应该是保存除了电子邮件和密码的使用.
我不得不使用这种格式:
validates :accpeted_terms, :acceptance => {:accept => true}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
13323 次 |
最近记录: |