リレーションシップでは、: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"]
私validates_associated
は、子供たちの自動保存以前の時代の遺物であり、もはや物事を行うための最良の方法ではないと思います。もちろん、それは必ずしも十分に文書化されているわけではありません。これがRails2.3にも当てはまるかどうかは100%わかりませんが、当てはまると思います。これらの変更は、ネストされた属性機能が追加されたときに発生しました(2.xのいつかでした)。
これは、私がgithubに投稿したトレーニングプロジェクトのコードの簡略化されたスニペットです。