rails_admin便利ですね。とりあえず管理画面…!という時には、重宝しまくり。で、Rails4から使えるモデルのenumなんだけど、これを<select>
のラベルとして使いたい。ということで、調べてみたらサクッとかけることが判明したのでメモ。
app/models/hoge.rb
class Hoge < ActiveRecord::Base
# enumの設定
CATEGORIES = { enemy: 1, player: 2 }
enum category: CATEGORIES
def category_enum
CATEGORIES
end
end
これだけ。これでrails_adminからは、こんな感じのHTMLが出力される。
<select>
<option value=1>enemy
<option value=2>player
</select>
ただし…!
- Rails v4.1
- rails_admin v0.6.5
の組み合わせだと(rails_adminは、2014/10/17時点で最新)、保存時にエラーが出る。
ArgumentError in RailsAdmin::MainController#new
'1' is not a valid state
どうやら、enumでStringを指定している影響で、Integerを保存しようとするとValidateエラーが出るというもの。rails_adminに渡すものをハッシュではなく、配列でString渡せば保存は問題なくできるけど、<select>
のselectedが正常に設定されない。
で、調べていたらrails_adminへのIssueで、解決してくれている人が…
これを作っておいておけば、いい感じにkey-valを設定してくれる。素晴らしい。
config/initializers/rails_admin_active_record_enum.rb
module ActiveRecord
module RailsAdminEnum
def enum(definitions)
super
definitions.each do |name, values|
define_method("#{ name }_enum") { self.class.send(name.to_s.pluralize).to_a }
define_method("#{ name }=") do |value|
if value.kind_of?(String) and value.to_i.to_s == value
super value.to_i
else
super value
end
end
end
end
end
end
ActiveRecord::Base.send(:extend, ActiveRecord::RailsAdminEnum)