みなさんは、ActiveRecordのenum好きですか?
models/article.rb
class Article < ActiveRecord::Base
enum status: { deleted: 0, drafted: 1, published: 2 }
# (略)
Article.published
とか、 @article.published?
とか気の利くメソッドをにょきにょき生やしてくれるので私は好きです
formでselectしたい
enumの要素をformタグのselectとか使って出力して編集画面作りたいことってありますよね。人間ですもの。
普通にやるとselectメソッドの2つめの引数に配列を渡してやればいいのでこんな感じ?
_form.html.slim
= f.select :status, Article.statuses.keys.to_a, {}, class: 'form-control'
keysを省略するとエラーになります
日本語で表示したい
なんかそれっぽくselectで表示できましたが、日本語で表示したいです。
要は2つめの引数に
{deleted: '削除済み', drafted: '下書き', published: '公開中'}
というような配列を渡してあげればいいので、モデルのクラスメソッドにこんなものを作ってみます
models/article.rb
class Article < ActiveRecord::Base
class << self
def localed_statuses
statuses.keys.map do |s|
[ApplicationController.helpers.t("status.article.#{s}"), s]
end
end
end
end
で、よしなな翻訳ファイルを用意してあげます
ja/status.yml
ja:
status:
article:
deleted: '削除済み'
drafted: '下書き'
published: '公開中'
ビューも書き換えます
= f.select :status, Article.localed_statuses, {}, class: 'form-control'
##補足
[ApplicationController.helpers.t("status.#{name.downcase}.#{s}"), s]
enumのstatusを使う率が高いので、
こう書き換えてクラス継承してもいいかなと思ったけどやり過ぎ感があるような気もしました
もっといい方法あれば教えて下さい
それでは!
2015.12.05 追記
上記の例ではモデルに設定していますが、viewで使いたい都合のメソッドかつ、モデルに紐付けて管理したい情報なので、 Decorator
に実装するのが良いかもしれませんね