ruby-on-rails – Rails model.valid?刷新自定义错误并错误地返回true

我试图添加一个自定义错误到我的用户模型的实例,但是当我调用有效?它正在擦除自定义错误并返回true.
[99] pry(main)> u.email = "test@test.com"
"test@test.com"

[100] pry(main)> u.status = 1
1

[101] pry(main)> u.valid?
true

[102] pry(main)> u.errors.add(:status,"must be YES or NO")
[
    [0] "must be YES or NO"
]

[103] pry(main)> u.errors
#<ActiveModel::Errors:[...]@messages={:status=>["must be YES or NO"]}>

[104] pry(main)> u.valid?
true

[105] pry(main)> u.errors
#<ActiveModel::Errors:[...]@messages={}>

如果我使用模型中的validate方法,那么它可以工作,但是这种特定的验证是从不同的方法(需要传递参数)中添加的:

User

def do_something_with(arg1,arg2)
  errors.add(:field,"etc") if arg1 != arg2
end

由于上述,user.valid?即使将该错误添加到实例,也会返回true.

解决方法

在ActiveModel中有效?定义如下:
def valid?(context = nil)
  current_context,self.validation_context = validation_context,context
  errors.clear
  run_validations!
ensure
  self.validation_context = current_context
end

所以现有的错误被清除是预期的.您必须将所有自定义验证放入一些有效的回调.喜欢这个:

validate :check_status

def check_status
  errors.add(:status,"must be YES or NO") unless ['YES','NO'].include?(status)
end

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...