2010-07-17 52 views
1

我想验证一个字段取决于相关模型的属性。看代码会更有意义(我希望)反向validates_associated

class User < ActiveRecord::Base 
    has_and_belongs_to_many :user_groups 
    has_one :profile, :dependent => :destroy 

    accepts_nested_attributes_for :profile 
    validates_associated \ 
    :profile, 
    :allow_destroy => true 
end 


class Profile < ActiveRecord::Base 
    belongs_to :user 

    validates_presence_of \ 
    :business_name, 
    :if => self.user.user_groups.first.name == 'Client' 
end 

当我提交表单,以创建一个新用户,我得到

undefined method `user_groups' for nil:NilClass 

基本上我只是想验证字段的存在business_name如果我正在创建一个新的客户端。

我也使用

:if => Proc.new { |p| p.user.user_groups.first.name == 'Clients' } 

具有相同的结果尝试。

也许我正在吠叫完全错误的树,但任何建议,以完成此?

回答

1

您有一个belongs_to关联,它取user_id并找到具有该ID的User对象。但是,在保存用户之前,您的个人资料模型正在验证中,因此它没有ID。在这种情况下,您的配置文件中的验证无法调用用户。

你需要,所以它在用户或配置文件触发梳通这样的逻辑,但如果你想先验证信息的用户信息不能指望一个创建的用户做它自己的验证。

这是一个鸡和鸡蛋的问题。

您可以通过添加一列像is_business到配置文件并修改代码如下解决这个问题:

class Profile < ActiveRecord::Base 
    belongs_to :user 

    validates_presence_of \ 
    :business_name, 
    :if => is_business? 
end 

和更新您的个人资料表格正确设置is_business在上下文。

+0

嗯......这是不可能的,然后直到validates_associated可以接受参数? – brewster 2010-07-17 03:21:48

+0

你的逻辑在这里很复杂。我更新了我的原始答案,以显示如何将配置文件中的验证逻辑与独立分离。你需要在is_business传递国旗以触发档案建立特殊业务validatoins。 – Winfield 2010-07-17 17:29:35