我试图添加一个自定义错误到我的用户模型的实例,但是当我调用有效?它正在擦除自定义错误并返回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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。