背景
Rails 4.1 より ActiveRecord::Enum
が利用可能となりました。
これにより以下の様な記述が可能となります。
class User < ActiveRecord::Base
enum role: [:general, :admin]
...
end
# role が admin なユーザを取得する
user = User.admin.first!
# admin かどうか
user.admin?
# role を確認
user.role # => "general"
# role を admin に変更
user.admin!
# role の取りうる値を確認
User.roles # => {"general"=>0, "admin"=>1}
これまで区分値として保持していた値が簡単に管理できるようになってハッピーです。
問題
しかし、これらの値を form 経由で変更しようとするとややこしいことになります。
= simple_form_for @user, ... do |f|
= f.input :role, collection: User.roles
= f.input :name
- submit で
ArgumentError
- i18n はどうする?
原因
(今のところ)ActiveRecord::Enum
は内部的に利用する値のために設計されているみたい。
対応案
案1: コアの対応待ち
ActiveRecord::Enum
は内部で利用する項目にのみ利用し、
ユーザからの変更には使わない。(≒View を通じて変更しない)
使いドコロがちょっと難しいですね。
コアで対応するかも未定なようです。
案2: enum_help を利用する
enum_help を使うと form の問題も i18n の問題も解決します。