83
78

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 5 years have passed since last update.

Rails: ActiveRecordのenum要素をselectフォームでいい感じに表示する

Last updated at Posted at 2015-10-02

みなさんは、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を省略するとエラーになります

日本語で表示したい

Screen Shot 2015-10-02 at 8.26.21 PM.png

なんかそれっぽく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 に実装するのが良いかもしれませんね

83
78
3

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
83
78

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?