2

一部のモデルにhas_many関係があり、ネストされた属性を受け入れます。この関係の検証に合格しなかった後、何らかの属性に属するすべてのエラーは、エラー ハッシュの同じキーに格納されます。

リクエストの一部:

"values_attributes":[{"value":"","attribute_id":1,"id":1,"auction_id":1},{"value":"6.6","attribute_id":3,"id":7,"auction_id":1}]

応答:

"values.value":["can't be blank","must be an integer"]

ここで、can't be blankエラーは最初の属性に属し、must be an integer2 番目の属性に属します。したがって、コントローラーに次のようなものを記述する必要があります。

errors = @auction.errors.to_hash
errors['values'] = Hash[@auction.values.reject{ |v| v.valid? }.collect{ |v| [v.attribute_id, v.errors.to_hash]}]

エラーがどのモデルに属しているかを理解する。

これを行うためのよりクリーンな方法はありますか?

4

1 に答える 1

1

子レコードから正確なエラーにアクセスする必要がある場合は、親のエラー コレクションにアクセスしてはなりません。子レコード自体には、詳細なアクセスを取得できるエラー コレクションがあります。親の集計エラーは、無効な子レコードがあるためにレコードを保存できないことを示しているだけです。

すべてのエラーが必要な場合は、自分で集計する必要があります。(collect電話で行ったように)。このコードが複数回使用される場合は、上のメソッドに移動することを検討してくださいAuction

class Auction
  def aggregated_errors
    errors = self.errors.to_hash
    errors['values'] = Hash[values.reject{ |v| v.valid? }.collect{ |v| [v.attribute_id, v.errors.to_hash]}]
    errors
  end
end

異なるモデルと関連付けのエラーを集約する必要がある場合は、collect呼び出しをさらに抽象化してモデル間で再利用できます。

于 2012-12-31T14:56:34.710 に答える