1

我正在使用 validates_existence_of gem。它运行良好,除非我想让我的外键为零。

这是我的用户和项目模型。一个项目属于一个用户和一个贡献者(一个贡献者也是一个用户),但是贡献者可以是nil。

这是我的用户模型:

class User < ActiveRecord::Base
  attr_accessible :first_name, :last_name
  has_many :projects, :dependent => :destroy
  has_many :user_trimester_statuses, :dependent => :destroy
end

这是我的项目模型:

class Project < ActiveRecord::Base
  attr_accessible :added, :amount, :contributor_id, :label, :ref, :trimester_id,    :user_id
  belongs_to :user
  belongs_to :contributor, :class_name => 'User'
  belongs_to :trimester
  validates :user, :existence => { :both => false }
  validates :trimester, :existence => { :both => false }
  validates :contributor, :existence => { :allow_nil => true, :both => false }
end

当我尝试添加新项目时,如果 user_id 或 trimester_id 字段为空白或无效,则会出现错误。但是对于contributor_id 字段,如果该字段无效,则不会抛出错误。它通过任何一种方式(有效、无效或无)。

我究竟做错了什么?我正在使用 ruby​​ 2.0.0p0 和 rails 3.2.13。

4

1 回答 1

2

看起来项目中有一个关于这个的开放错误。

https://github.com/perfectline/validates_existence/issues/15

您可能必须为这种情况编写一个简单的自定义验证器,直到问题得到解决。(或深入研究,看看您是否可以自己解决问题)

更新:我刚刚克隆了该项目并编写了一个测试以查看问题所在。似乎当您添加 allow_nil 时,根本不会调用存在验证器。我不确定为什么会这样,但与此同时,您可以使用 proc 以一种简单的方式解决该错误。代替

validates :contributor, :existence => { :allow_nil => true, :both => false }

这将完成工作

validates_existence_of :contributor, :unless => Proc.new { |obj| obj.contributor_id.blank? }

我能够在我的测试用例中证明这一点。(我使用了 'validates_existence_of' 方法,而不是 'validates',因为我认为在这种情况下它更干净)

于 2013-04-08T18:25:55.420 回答