我正在尝试创建自定义验证程序并将其错误消息添加到:base
。基本上一切都运行正常,但object.errors
数组中没有我的消息内容。
# app/models/video.rb
# ...
validate :if_only_pending_video
# ...
def if_only_pending_video
return unless job_id.present?
if job.videos.pending.any?
errors.add(:base, "My error message")
end
end
FactoryGirl.build(:video).valid? # => false
FactoryGirl.build(:video).errors? # => []
我有大约99%的测试覆盖率,并且我确信valid?
在该验证器的原因中返回false
。我只是无法理解为什么errors
数组中没有消息。
答案 0 :(得分:1)
看起来代码示例本身有点不正确。在第一行,您构建一个对象并检查其有效性:
FactoryGirl.build(:video).valid? # => false
结果为false
,此处出现错误:您构建一个全新的video
对象并检查其错误(但由于此对象尚未经过验证,因此没有):
FactoryGirl.build(:video).errors? # => []
# this is a completely different object.
# object_id of this video is not the same as object_id of the first one built.
您应该检查它的方法是使用相同的对象进行验证和错误检查:
some_video = FactoryGirl.build(:video)
some_video.valid? # => false
some_video.errors # => [[:base, "My error message"]]
作为旁注,您可以在if_only_pending_video
方法中删除该条件并使用条件验证:
validate :if_only_pending_video, :if => lambda{|object| object.job_id.present? }