🗽

Rails enumの日本語化

2023/06/08に公開

はじめに

現在ポートフォリオ作成中のプログラミング初学者です🔰

性別選択をenumを使って定義したのですが、
それを日本語化する時にまた日本語になかなか変わらず少し苦労したので
記録を残しておきます👀

ちなみに、enumを使うメリットは

  • 自動でヘルパーメソッドやスコープを生成してくれて便利
  • コードの可読性が上がる
  • 文字列としてデータを保存するよりストレージを圧迫しない
    などがあります。

デメリットはそこまで考えられていなかったので下記の記事が勉強になりました🥹
https://zenn.dev/shuhei_takada/articles/be002838ae379a

enumの日本語化

  • enum用のカラムはテーブルに追加済みです!
db/schema.rb
create_table "end_users", force: :cascade do |t|
:
  t.integer "sex", default: 0end

モデル

  • 以下のようにsex(性別)カラムの値(0,1,2,3)にそれぞれwoman, man, neither, no_answerの定数を設定します。
app/models/end_user.rb
class EndUser < ApplicationRecord
:
  enum sex: { woman: 0, man: 1, neither: 2, no_answer: 3 }end

ja.yml

  • ja.ymlに以下を追記。(インデントに要注意)
config/locales/models/ja.yml
ja:
  activerecord:
    models:
      end_user: "ユーザー"
    attributes:
      end_user:
        sex:
        sexes:
          woman: "女性"
          man: "男性"
          neither: "どちらでもない"
          no_answer: "無回答"

注意点🔥

enumにI18nを使う場合は、翻訳ファイルに設定するキー名に気をつける!

今回の場合sex(性別)は以下の階層に定数名をそのまま定義できそうだが、そうすると日本語に反映されない。sex(性別)と同じ階層にsexesを配置し、その中で定数名を定義する事で日本語の翻訳をする事が出来る!

enumでI18nを使用する場合、
enumを使用するカラム名を複数形にして定数名を日本語へ翻訳する。

view

  • ユーザーの編集フォームでsex(性別)も登録できるように、以下のコードを追加しセレクトボックスを作成します。
app/views/public/end_users/edit.html.erb
<label>性別</label>
<%= f.select :activelevel, options_for_select(EndUser.activelevels.map { |k, _v| [t("activerecord.attributes.end_user.activelevels.#{k}"), k] }), { data: {} } ,class: 'form-control' %>

追記

フォームの中の記述は上記の記述でいけたのですが、
表示の方がうまくいかず、メンターさんを頼りました!

app/views/public/end_users/profile.html.erb
<h2>性別</h2>
<p><%= @end_user.sex_i18n %></p>
  • 記述はあっているはずなのに日本語化されず、、
  • ja.ymlファイルにenumsを追記したら無事変わりました!
config/locals/ja.yml
ja:
+  enums:
+    end_user:
+      sex:
+        woman: "女性"
+        man: "男性"
+        neither: "どちらでもない"
+        no_answer: "無回答"
+      activelevel:
+        level1: "レベル1"
+        level2: "レベル2"
+        level3: "レベル3"
  activerecord:
    models:
      end_user: "ユーザー"
    attributes:
      end_user:
        sex:
          woman: "女性"
          man: "男性"
          neither: "どちらでもない"
          no_answer: "無回答"
        sexes:
          woman: "女性"
          man: "男性"
          neither: "どちらでもない"
          no_answer: "無回答"
        activelevel:
        activelevels:
          level1: "レベル1"
          level2: "レベル2"
          level3: "レベル3"

色々な記事を見ても、enumsの記載があったりなかったり、
明確に記載しなければいけない理由などは書いておらずメンターさんと頭抱えましたが、
https://github.com/zmbacker/enum_help
こちらのgithubにもenumの記載があるので必要だよねに落ち着きました。

参考にさせていただいた記事🌱

https://pikawaka.com/rails/i18n#enum

Discussion