---

こんにちは〜

【Rails】nested attributesのerrorsに何番目か(index)を追加する

http://o.inchiki.jp/obbr/191

items[0].name と items[1].description にエラーがあった場合、

@user.errors["items.name"] # items[0] のエラーが入っている
@user.errors["items.description"] # items[1] のエラーが入っている

という状態になる。

なる。
上記の場合に、items[0]のエラーなのかitems[1]のエラーなのかがわかるようにしたかったので調べた。

発見!!

https://qiita.com/kano-e/items/ecd7773ab817fd1e6e07

class User < ApplicationRecord
  has_many :conditions, index_errors: true
  accepts_nested_attributes_for :conditions
end

index_errors: trueをつければOK
つけた状態だと

@user.errors["items[0].name"]        # items[0] のエラーが入っている
@user.errors["items[1].description"] # items[1] のエラーが入っている

になってくれる。

エラーメッセージもいい感じにしてくれるらしい。(新しいRailsだと)

http://y-yagi.hatenablog.com/entry/2018/09/09/064426

Merge pull request #33615 from Larochelle/i18n_full_message_with_nested_attributes

activemodel/lib/active_model/errors.rbの修正です。

ActiveModel::Errors#full_message メソッドでi18n用のkeyを生成する際に、[\d]を除去するよう修正しています

index_errorsにtrueを指定している場合に[\d](e.g. activemodel.attributes.person/contacts[0]/addresses[0].street)が含まれてしい、index_errorsを指定してない場合と同じi18nの値を取得出来るようにする為。

(私が触っているのは5.0系だったのでいい感じにならなかった。。)

参考

Railsのバリデーションでネストした配列に含まれる子モデルのエラーメッセージを個別に表示する [俺の備忘録]

has_many な accepts_nested_attributes_for のバリデーションエラーに index 追加するオプション - Qiita

rails commit log流し読み(2018/09/08) - なるようになるブログ