RoR - 使用nil外键无效的Validates_existence_of

时间:2013-04-08 16:12:23

标签: ruby-on-rails belongs-to

我正在使用validates_existence_of gem。它的效果很好,除非我想让我的外键为零。

以下是我的用户和项目模型。项目属于用户和贡献者(贡献者也是用户),但贡献者可以是零。

这是我的用户模型:

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。

1 个答案:

答案 0 :(得分: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'方法,而不是'验证',因为我认为在这种情况下它更干净)