概要

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

このコードと上記の日本語化設定を組み合わせることで、ユーザーがフォームに不正な値を入力した際に発生するバリデーションエラーのメッセージを日本語で表示することができます。