この記事は一体?
Railsでenumの値をi18nに対応させる方法として、よく紹介されるのがGemを入れて対応させる方法です。
例えば enum_help や、 enumerize がよく取り上げられます。
しかし、enum_helpは(2019/12/17現在)更新が2017年で止まっており、
継続してメンテナンスされてないGemをプロジェクトに入れるのは考えものでしょう。
enumerizeは高機能ではありますが見慣れたenumの書き方ではなくなるし、
やりたいことに対してオーバースペック気味なのでは? と感じます。
そこで、Gemに頼らず自前でenumの値をi18nに対応させてみます。
ここでは以下の2点を実現します。
- モデルのインスタンスからenumのカラムの値を日本語化して取得する
- モデルからenumのカラムで設定可能な値の配列を日本語化して取得する
方法
各モデルの親クラスとなるApplicationRecord
にメソッドを追加します。
やってることとしては、モデル名とenumのカラム名、そしてenumの値から対応するi18nを取得しているだけです。
application_record.rb
class ApplicationRecord < ActiveRecord::Base
def enum_i18n(enum_name)
return nil if self.send(enum_name).nil?
I18n.t!("enums.#{self.model_name.i18n_key}.#{enum_name}.#{self.send(enum_name)}")
end
def self.enums_i18n(enum_name)
self.send(enum_name.to_s.pluralize).map do |key, value|
[I18n.t!("enums.#{self.model_name.i18n_key}.#{enum_name}.#{key}"), value]
end.to_h
end
end
あとはenumを設定した各モデルで、このメソッドを使うだけです。
user.rb
class User < ApplicationRecord
enum status: { hoge: 0, fuga: 1, piyo: 2 }
end
ja.yml
ja:
enums:
user:
status:
hoge: ほげ
fuga: ふが
piyo: ぴよ
user = User.new(status: :hoge)
user.enum_i18n(:status)
# => "ほげ"
User.enums_i18n(:status)
# => {"ほげ"=>0, "ふが"=>1, "ぴよ"=>2}
これだけやれれば、追加でGemなくしてi18nに対応できてるでしょう。
参考記事