我正在使用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。
答案 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'方法,而不是'验证',因为我认为在这种情况下它更干净)