18

Rails 3 にはvalidates_associated、ネストされたモデルを保存するときに自動的に呼び出される が含まれています。メソッドの問題は、メッセージがひどいことです-「モデルが無効です」

Rails 2 のこの問題を攻撃する投稿がいくつかあります。

おそらくもっとあります。これらの投稿で説明されているように、Rails 3 と互換性のあるより優れたバージョンがあれば素晴らしいことです。主な改善点は、関連付けられたモデルが失敗する理由を含めることです。

4

4 に答える 4

5

リレーションシップでは、: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に投稿したトレーニングプロジェクトのコードの簡略化されたスニペットです。

于 2012-02-14T01:57:49.037 に答える
3
于 2012-11-27T21:44:07.390 に答える
1

validates_associated は、関連付けられたオブジェクトのクラスで指定された検証を実行します。親クラス レベルでのエラーは、単に「私の子は無効です」と言うだけです。詳細が必要な場合は、子オブジェクトのエラーを公開します (ビュー内の子のフォームのレベルで)。

于 2011-03-03T04:28:23.537 に答える
-1

ほとんどの場合、必要なのはvalidates_existence_ofだけです。

于 2011-01-26T10:07:53.023 に答える