errors.add(:base)有效,但没有错误消息

时间:2014-06-19 18:41:01

标签: ruby-on-rails ruby ruby-on-rails-3

我正在尝试创建自定义验证程序并将其错误消息添加到: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数组中没有消息。

1 个答案:

答案 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? }