保存父对象时如何确保子对象有效?

让我说我有两节课

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"]}>