Help us understand the problem. What is going on with this article?

RailsのenumをGem無しでi18nに対応させる

この記事は一体?

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に対応できてるでしょう。

参考記事

https://www.kostolansky.sk/posts/localize-rails-enums/

rhistoba
膝に金具が入っていたWebエンジニア
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした