Close icon
2017月12日18日

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 プロジェクト作っていたりしたら地味に時間がかかりました。

まあ仕組みがわかっちゃえば次から使えるしいいかな。

たまには思いつきでも技術ネタ書いておかないと、ただのガジェット好きな人になっちゃうので・・・。



アトトックラボとは

株式会社アトトックメンバー が技術の話、デザインの話、キャラクターの話、ときどき脱線してガジェットの話やライフハックの話など好きなことを書いています。


連載記事


最近の記事


タグ