在关系上,您可以使用:autosave => true
相反,当您保存父模型时,它将尝试保存子模型。这将自动运行子级的验证,并且他们将报告正确的错误消息。
此外,如果您在必须设置父对象的子对象上添加存在验证,并且通过关联构造子对象,则甚至不需要autosave
标记,然后您会收到一条漂亮的错误消息。例如:
class Trip < ActiveRecord::Base
validates :name, :presence => true
attr_accessible :name
has_many :places, dependent: :destroy, :inverse_of => :trip
end
class Place < ActiveRecord::Base
belongs_to :trip
validates :name, :trip, presence: true
attr_accessible :name
end
然后你可以得到一个很好的错误消息,使用场景如下:
> trip = Trip.new(name: "California")
=> #<Trip id: nil, name: "California">
> trip.places.build
=> #<Place id: nil, name: nil, trip_id: nil>
> trip.valid?
=> false
> trip.errors
=> #<ActiveModel::Errors:0x00000004d36518 @base=#<Trip id: nil, name: "California">, @messages={:places=>["is invalid"]}>
> trip.errors[:places]
=> ["is invalid"]
I think validates_associated
这是自动拯救儿童之前时代的遗物,并且不再是最好的做事方式。当然,这不一定有很好的记录。我不能 100% 确定这也适用于 Rails 2.3,但我有一种感觉。这些更改是在添加嵌套属性功能时发生的(2.x 中的某个时候)。
这是一个简化的代码片段我在github上发布的培训项目 https://github.com/wolframarnold/where-have-you-been.