はじめに
Rails8でEnumを使う際に、少し詰まったので備忘録としてのこしておきます。
Rails8から7まで非推奨で使えていたEnumの定義方法が使用禁止となったようです。
また、日本語化の方法も検索して出てきた記事で上手く解決できなかったので、残しておきます。
バージョン情報
- Rails8
- Ryby3.4
やりたいこと
- enumを定義したい
- enumの英語表記を日本語化したい
enumを定義したい
やったこと
- モデルファイルに以下を記述
enum gender: [ :male, :female, :non_binary ]
- コンソールで確認
- Profile.genders
エラー内容
wrong number of arguments (given 0, expected 1..2) (ArgumentError)
原因
- Rials8ではキーワード引数を使用した列挙型が使用禁止になっている
解決策
-
位置引数を使用する
enum :gender, [ :male, :female, :non_binary ]
enumの英語表記を日本語化したい
やりたいこと
-
以下のようにenumで定義した単語を日本語化したい
enum :gender, [ :male, :female, :non_binary ]
やり方
前提
- 上記の
gender
はプロフィールページとプロフィール更新用のフォームで使用
I18nの設定
-
Railsプロジェクトを日本語化する
# config/application.rb module Myapp class Application < Rails::Application config.i18n.default_locale = :ja # 追加 config.i18n.load_path += Dir[Rails.root.join("config", "locales", "**", "*.{rb,yml}").to_s] # 追加 end end
-
config/locales配下にymlファイルを作成
# config/locales/enum.yml ja: # おそらくここを見て、訳文を読み込み enum: genders: male: '男性' female: '女性' non_binary: 'ノンバイナリー'
- デフォルトロケールを
:ja
にした場合、ymlファイルのトップに:ja
があるファイルの訳文を読み込む
- デフォルトロケールを
使い方
-
I18n.t メソッドを使用してymlファイルから訳文を読み込む
I18n.t("enum.genders.male") # => '男性' と表示される I18n.t("enum.genders.female") # => '女性' と表示される I18n.t("enum.genders.non_binary") # => 'ノンバイナリー' と表示される
- :
ja
以下のymlファイルの記述をメソッドチェーンのように記述することで訳文にアクセスできる
- :
-
Viewでの使い方
%p= I18n.t("enum.genders.#{current_user.display_gender}") # => ログインユーザーの`gender`
-
SELECTフォームでの使い方
= f.select :gender, Profile.genders.map { |k, v| [I18n.t("enum.genders.#{k}"), k]}, {}, class: 'text'
-
form_with
のselectメソッドは、第2引数に配列を渡すと[ [ '表示名1', 'Value1' ], [ '表示名2', 'Value2' ] ]
として使用可能 -
Profile.genders
は{"male" => 0, "female" => 1, "non_binary" => 2}
というハッシュ -
Profile.genders
をmapで[["男性", "male"], ["女性", "female"], ["ノンバイナリー", "non_binary"]]
にする必要がある
-