概要
Railsでネストしたモデルをフォームで扱う際、accepts_nested_attributes_for
メソッドを使用して親子関係にあるモデルの属性を一度に更新することがよくあります。
この時に子モデルでバリデーションエラーが発生した場合のエラーメッセージを日本語化するのに苦労したため、その解決策について記事にしたいと思います。
通常のエラーメッセージの日本語化設定
ja:
activerecord:
attributes:
user:
name: 名前
post:
title: タイトル
この設定では、User
モデルのname
属性とPost
モデルのtitle
属性が日本語化されます。
しかし、nested_attributes
を使用してPost
モデルを更新する場合、この設定だけでは不十分です。
問題の解決策
問題の解決策は、子モデルを表すキーを複数形にすることです。
つまり、post
ではなくposts
を使用する必要があります。設定ファイルを以下のように修正します。
ja:
activerecord:
attributes:
user:
name: 名前
posts:
title: タイトル
この変更により、User
モデルのaccepts_nested_attributes_for :posts
を通じてPost
モデルの属性を更新する際に発生するバリデーションエラーメッセージも適切に日本語化されるようになります。
実際のコードでの適用例
以下はnested_attributes
を使用して子モデルを更新する簡単な例です。
def update
user = User.find(params[:id])
user.update(update_params)
end
def update_params
params.require(:user).permit(posts_attributes: [:title])
end
このコードと上記の日本語化設定を組み合わせることで、ユーザーがフォームに不正な値を入力した際に発生するバリデーションエラーのメッセージを日本語で表示することができます。