LoginSignup
12
12

More than 5 years have passed since last update.

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

Posted at

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)
12
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
12