Help us understand the problem. What is going on with this article?

rails_adminでenum指定したデータをラベルで選択できるようにする

More than 5 years have passed since last update.

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)
zaru
basicinc
マーケティングとテクノロジーで社会のあらゆる問題を解決する集団
https://tech.basicinc.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away