読者です 読者をやめる 読者になる 読者になる

リア充爆発日記

You don't even know what ria-ju really is.

RubyでEnumを使いたかったらenumerize

追記)この記事古いので、Rail4.1以上を使う場合は、ActiveRecord::Enum使ったほうがいいと思います。

https://github.com/brainspec/enumerize

結論からいうと、これはいいです。
例えば職業や性別なんかのDBで管理するほどのもんじゃないものはコレで扱うといい。

Gemfile

gem "enumerize", "~> 0.7.0"

models/user.rb

class User < ActiveRecord::Base
  extend Enumerize
  enumerize :sex, in: %w(male female)

とりあえず、おおっ、と思ったのはこれだけでsexに対するinclusionのバリデーションがかかるのだ。

で、i18nと組み合わせるとvalueとのマッピングが柔軟になる。
locales/models/user/ja.yml

ja:
  enumerize:
    user:
      sex:
        male: 男
        female: 女

ただ、viewの素のformで使うとき、selectはさらっとかけるのにradio buttonはさらっといけなかった。
simple_formと合わせて使うとさらっといけるようだけども。

    # selectの場合
    <%= f.select :sex, User.sex.options %>

    # radio buttonの場合
    <%= f.radio_button :sex, :male %><%= t('enumerize.user.sex.male') %>
    <%= f.radio_button :sex, :female %><%= t('enumerize.user.sex.female') %>

あとホントは、以下のように使えればほんと最高なんだけど、それはできなかった。

User.sex.male => :male
User.sex.male.value => 男

でもi18n-jsを入れておけば、JS側でも使えるし。

console.log I18n.t("enumerize.user.sex.male") #=> 男

※ほんとはもうちょっと手順がいる。詳細は→http://d.hatena.ne.jp/ria10/20130304/1362383794

これはもっと早く使っていればよかった。