【Ruby on Rails】Formオブジェクト(ActiveModel)のエラーメッセージを日本語化する方法


本記事の概要

・Formオブジェクトのバリデーションエラーが日本語にならない問題に悩んだので、備忘録として残しておきます。
・+α余談としてActiveRecordとActiveModelの違いについて少し触れました。

開発環境

Mac OS Catalina 10.15.4
ruby 2.6系
rails 6.0系

前提条件

gem 'rails-i18n'を導入してデフォルトの言語設定はすでに日本語にしています。
また、configのlocalsディレクトリにja.ymlファイルを作成済みです。

エラーメッセージを日本語化できなかった原因とその対策

結論から言うと、今回作成したFormオブジェクトはinclude ActiveModel:Modelによってactivemodelを継承したモデルであったにも関わらず
activerecordを継承したモデルとして日本語化を行おうとしたのが問題だったよう。

<誤っていたコードの記述>

ja.yml
ja:
  activerecord:
    models:
      detail: 詳細情報
      posts_tag: 投稿 
    attributes:
      user:
        name: 名前
      detail:
        age: 年齢
        pr: PR
        area_id: 居住地
        occupation_id: 職業
        interest_id: 興味
      posts_tag: 
        title: タイトル
        content: 概要
        name: タグ

<正しいコードの記述>

ja.yml

ja:
  activerecord:
    models:
      detail: 詳細情報
    attributes:
      user:
        name: 名前
      detail:
        age: 年齢
        pr: PR
        area_id: 居住地
        occupation_id: 職業
        interest_id: 興味

  activemodel:
    models:
      posts_tag: 投稿 
    attributes:
      posts_tag: 
        title: タイトル
        content: 概要
        name: タグ

余談

ちなみに、rails g modelで生成するデフォルトモデルが継承しているActiveRecordとActiveModelの違いは、DBとのやり取りが可能か否かにあります。

前者は、可能なのでモデル名.findなどですでに保存してあるデータを引っ張ってこられますが、後者のActiveModelは通常findメソッドは使えません。

他にも、バリデーションにおける`validates uniqueness: true等も、DBに保存されているデータを参照して一意性かどうか判断するので、ActiveModelで記述することはできません。

そんな感じで便利な一方、割とActiveModelはややこしいですね...
なにはともあれ、最後までお読み頂きありがとうございました!