LoginSignup
2
0

More than 3 years have passed since last update.

Railsのenum値を設定するだけで、自動でI18n.translate対応用のメソッドが使えるようにする

Posted at

はじめに

自分でチョロっと作ったプロジェクトで、I18nの翻訳のキーを毎回書くのが面倒だったので、このような形も一つのやり方かもしれないのでメモっておいた。もっと良いやり方があれば知りたい。
例えばdecoratorとかに書くのもよいが、全てのenumに対して翻訳のキーが必要とすると、それをいちいち書くのもめんどくさい。

環境

  • ruby 2.6.3
  • Rails 5.2.3

localesを設定する

※実際にこのルールである必要はないが、サンプルでI18nを使っている

ja:
  models:
    items:
      enums:
        status:
          draft: 下書き
          publish: 公開中
          sellout: 売切れ

enum翻訳用のメソッドを拡張モジュールに置く

※先程のルールに合わせ、keyを指定する

module Extensions
  def enum_translated(enums, option = {})
    enum enums.merge(option)
    define_method("#{enums.keys.first}_t") do
      # localeの仕様に合わせれば良い
      I18n.t("models.#{self.model_name.plural}.enums.#{enums.keys.first}.#{self.send(enums.keys.first)}")
    end
  end
end

モデルに通常 enum と書くところを enum_translated で設置

class Item < ApplicationRecord
  extend Extensions

  enum_translated status: { draft: 0, publish: 1, sellout: 2 }, _prefix: true
end

使うとき

カラム名_t で翻訳される

item = Item.new(status: :publish)
item.status # publish
item.status_t # 公開中

# prefixなども動く
Item.status_draft # status == :draft のレコードを取得
2
0
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
2
0