我看不出我错过了什么,但显然有些不对。
模特:
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"]
答案 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_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
设计使用 configure_permitted_parameters 方法了解除了电子邮件和密码之外应该保存哪些参数。
答案 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
如果您的默认参数为1
或0
。尝试这样做:
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”