はじめに
自分でチョロっと作ったプロジェクトで、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 のレコードを取得