我正在尝试根据相关模型的属性验证字段。看代码会更有意义(我希望)
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' }
具有相同的结果。
也许我正在咆哮完全错误的树,但有任何关于完成这个的建议吗?答案 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。