我看不到我所缺少的东西,但是显然不对。
在模型中:
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"]
最佳答案
更新的答案..
因此,事实证明问题出在表中的术语是实际列。通常,validates_acceptance_of是不带此列使用的,在这种情况下,它将定义属性访问器并将其用于验证。
为了使validates_acceptance_of映射到真实表列时起作用,必须传递:accept选项,例如:
validates :terms, :acceptance => {:accept => true}
其原因与Active Record中的类型转换有关。当命名属性实际存在时,AR根据数据库列类型执行类型转换。在大多数情况下,acceptance列将被定义为 bool(boolean) 值,因此model_object.terms
将返回true或false。当没有此类列时,
attr_accessor :terms
只需从params哈希返回传入模型对象的值,该值通常是复选框字段中的"1"
。
关于ruby-on-rails - 验证接受始终失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4746710/