Ruby on rails ActiveRecord有效吗?方法返回true,即使存在错误

Ruby on rails ActiveRecord有效吗?方法返回true,即使存在错误,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我有一个头痛的地方,我相信很简单,我只是忽略了。考虑下面的模型: class Flag < ActiveRecord::Base belongs_to :user belongs_to :flaggable, polymorphic: true validates :reason, presence: true validates :flaggable_id, presence: true validates :flaggable_type, presence: tr

我有一个头痛的地方,我相信很简单,我只是忽略了。考虑下面的模型:

class Flag < ActiveRecord::Base
  belongs_to :user
  belongs_to :flaggable, polymorphic: true

  validates :reason, presence: true
  validates :flaggable_id, presence: true
  validates :flaggable_type, presence: true

  before_create :allow_unique_only

private
  def allow_unique_only
    errors.add(:base, "You have already flagged this.") if self.user.flagged?(self.flaggable)

    Rails.logger.debug("Errors: #{errors.full_messages}")
    Rails.logger.debug("Valid: #{valid?}")
  end
end
class标志
很简单。除执行此操作外,它会将错误添加到base中,并在控制台中按原样提供错误输出,但它也声明对象有效


错误:[“您已经对此进行了标记。”]
有效:正确

而且它节省了!有什么好处


编辑:我知道我可以通过添加类似于
错误的内容来实现。空?
在该方法的结尾,我只是想了解为什么ActiveRecord认为它有效。

您应该将该方法添加为验证程序,一旦验证程序完成,您就可以检查
有效?

在创建之前删除,然后添加:

validate :allow_unique_only

为了回答您关于为什么会发生这种情况的问题(因为这也让我感到惊讶),我查看了源代码。在版本4.8.2中(我正在使用的版本也显示了这种行为),
ActiveModel\valid?
的定义清除现有错误,然后运行“真实”验证

def有效?(上下文=nil)
当前上下文,self.validation\u context=验证上下文,上下文
错误,清除
运行验证!
确保
self.validation\u context=当前\u context
结束
我试图追踪这种行为的历史,但它在12年内没有改变,显然是SVN项目迁移的一部分;旧的SVN回购协议对我来说无法加载,因此最初的“为什么”可能会消失在时间的沙子中