accepts_nested_attributes_forしたときのi18n
Rails 5.0.2
Railsでi18n書くときに、ちょっと複雑になるとYAMLをどう書けばいいかわからなくなる問題。
たぶんソース見るのが一番良い。こことかね。
のだけど、accepts_nested_attributes_forしたときのi18nの書き方だけまとめておく。
こんな感じのmodelだったとして、
class Parent < ApplicationRecord has_many :children accepts_nested_attributes_for :children end class Child < ApplicationRecord belongs_to :parent validates :name, presence: true end
accepts_nested_attributes_for
を使って、ParentsController#create / update
から一気にChild
の作成/更新までやるとする。
ここで、Child
側でValidation Errorが発生したら、当然エラーメッセージを画面に出したい。このとき、i18nをどう書くか。言い換えると、Child
のname
属性を空のままpostされた場合に、@parent.errors.full_messages
の結果が、i18nで「子供の名前を入力してください。」となるようにするにはどうすればいいかという話。
で、結論は、こう。
ja: activerecord: attributes: parent/children: name: 子供の名前
辿り方としては、まず、@parent.errors
の中身を見ると、このように子のvalidation errorが格納されていることがわかる。
@details={:"children.name"=>[{:error=>:blank}]}
このchildren.name
の翻訳をどのように探しに行くか、以下のコードを見ると、
parts = attribute.to_s.split(".") attribute = parts.pop namespace = parts.join("/") unless parts.empty?
この部分で、attribute
にname
が、namespace
にchildren
が入り、
:"#{attributes_scope}.#{klass.model_name.i18n_key}/#{namespace}.#{attribute}"
これにより、#{attributes_scope}.parent/children.name
という文字列が組み立てられることになるわけ。