保存父对象时如何确保子对象有效?
让我说我有两节课
class User attr_accessible :name has_one :address validates :name, :presence => true validates_associated :address end class Address attr_accessible :country, :user_id belongs_to :user validates :country, :presence => true validates :user, :presence => true end
现在当我尝试创建无效的Address
然后它失败(这是好的)
a = Address.new a.valid? #=> false
但是当我使用无效Address
构建用户时,它会通过(这很糟糕)
u = User.first u.build_address u.valid? #=> true u.save #=> true
由于此User
具有country => nil的Address
。
如果Rails无效,我如何告诉Rails不保存Address
?
修复:我通过在代码中添加跟随行来修复此问题。 谢谢大家。
validates_associated :address, :if => :address
class User attr_accessible :name has_one :address, :validate => true validates :name, :presence => true validates_associated :address
结束
您还需要validationUser
实际存在的User
:
class User < ActiveRecord::Base validates :address, :associated => true, :presence => true end
有了这个,我得到:
>> u = User.first => # >> u.build_address => # >> u.valid? => false >> u.errors => #, @messages={:address=>["is invalid"]}> >> u.address.errors => #, @messages={:country=>["can't be blank"]}>