enum で定義したい値を再利用したり f.select なんかで使うデータを生成してみたり。
以前 kurusaki さんが書いていた記事 をもうちょっと前に進めて、enum で定義した値を元に f.select ヘルパーなんかで表示する選択肢を生成するようにしてみました。みんな安心のローカライズ対応済みです。
ちなみにステータスはマスタ的に使えるように単体のクラスとして書いて、再利用できるようにしてみました。
まずは Status クラスを作ってステータスを定義。ステータスを利用するモデルで enum に使用する値はハッシュとして返すように self.options_for_enum に、f.select なんかで使う値はローカライズされた文字列も欲しいので self.options_for_status に書いてあります。
class Status
def self.options_for_enum
{ draft: 0, published: 1 }
end
def self.options_for_status
res = []
self.options_for_enum.each do | key, value |
res.push([(I18n.t "status.#{key}"), key])
end
return res
end
end
ステータスを利用したいモデルでは enum でカラムを指定、中身は Status クラスの options_for_enum の返すハッシュが入ります。
class Entry < ApplicationRecord
enum status: Status.options_for_enum
end
最後にローカライズを書いておきます。
ja:
status:
draft: 下書き
published: 公開
View で選択肢を表示させる時に使うならこんな感じ。f.select って使うときに選択肢を設定しておくのが map したりとかいろんな方法があって個人的には面倒なんですが、ちょっとすっきりしました。
= f.select :status, Status.options_for_status
全然関係ないプロジェクトをやっていて急に気づいた話だったのですが、どうしてもラボの記事にしたくて・・・検証用に新しい rails プロジェクト作っていたりしたら地味に時間がかかりました。
まあ仕組みがわかっちゃえば次から使えるしいいかな。
たまには思いつきでも技術ネタ書いておかないと、ただのガジェット好きな人になっちゃうので・・・。