反向validates_associated

时间:2010-07-17 01:28:22

标签: ruby-on-rails validation model

我正在尝试根据相关模型的属性验证字段。看代码会更有意义(我希望)

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 个答案:

答案 0 :(得分: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。