20
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-12-17

この記事は一体?

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

参考記事

20
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?