2011-03-03 114 views
0

如何执行验证检查(和插入错误消息到一个错误结构),其上是HAS_ONE关联的属性。Ruby on Rails的 - 的has_many属性验证

如果“衬衫”或“裤子”发生错误,我如何访问该错误? 公司将在person.shirt.errors错误[:颜色]?

当我触发person.save,针对person.shirt验证激活?

当我触发person.save并发生person.shirt错误时,错误消息将保存在哪里?在person.shirt.errors或person.errors?

class Person < ActiveRecord::Base 
     has_one : shirt 
     has_many : pants 
     validates :name, :presence => true 
     validates_length_of :name, :minimum => 3 
end 

person = Person.new(:name => "JD") 
person.shirt.create(:color=> "red") 
person.pants.create(:type=> "jeans") 
person.valid? 
+0

由于某种原因,我不能够添加注释到以前的答案,所以我写我的意见在这里。 edgarjs(或任何其他人),关于这种方式的最后一个问题。 如果错误在裤子[2] .color内,错误将出现在'person.errors.at(:shirt [2] .color)'或'person.errors.at(:shirt [2])中'或者可能两种情况? 如何获取has_many关联对象的错误消息? thx – batz107 2011-03-13 14:09:57

回答

2

,当你调用person.save您可以验证模型的关联与

validates_associated :shirt 

这样,它会触发shirt的验证。

是的,您可以通过person.shirt.errors访问关联的错误,但请确保在触发验证后执行此操作。例如:

person = Person.new 
person.errors # => will be empty 

这是因为验证尚未运行。所以,你需要调用savevalid?或触发验证任何其他方法。

person = Person.new 
person.valid? 
person.errors # => will have errors in person 

而且它的协会一样的:

person.shirt.valid? 
person.shirt.errors 

但因为你是用validates_associated验证的关联也就足够用person.valid?引发衬衫的验证。

+0

edgarjs thx为回应。如果错误在衬衫中,它是否也会出现在person.errors中? – batz 2011-03-03 15:59:42

+0

edgarjs,你有没有改变看我的评论? – batz 2011-03-06 08:50:29

+0

对不起,刚刚阅读您的评论。如果错误是在衬衫,它将作为“衬衫是无效的”,但没有更多的细节,但你可以随时访问'person.shirt.errors'得到衬衫的错误出现在人。 – edgarjs 2011-03-07 23:01:54