【Rails】enumをさらに便利にしてくれるgem enumerize(日本語化も)
Ruby on RailsでEnum = 列挙型を使う時に色々と便利なGemenumerize
の紹介です。
enumは例えば、ユーザーの性別とか、ステータスとか複数の項目を持つデータを扱う際に使います。
Railsだけでもenumを扱うことは出来るのですが、enumerize
を使うと簡単に日本語表示できたりformを簡単に作れたり便利です。
使い方
Gemfile
にenumerize
を追加してbundle install
します。
# Gemfile gem 'enumerize'
enumerize
を使うカラムをモデルで定義します。
migrationする際に、defaultを定義しておくとrake db:migrate
した際に既存のデータへも値が入るので設定します。
# Migration class AddRoleToNewUser < ActiveRecord::Migration[5.2] def change add_column :new_users, :role, :string, default: 'member', null: false end end ↓ > NewUser.select(:id, :name, :role).limit(5) => [#<NewUser:0x00007fca26d4adf8 id: 1, name: "opiyo", role: "member">, #<NewUser:0x00007fca26d4a650 id: 2, name: nil, role: "member">, #<NewUser:0x00007fca26d49ed0 id: 3, name: nil, role: "member">, #<NewUser:0x00007fca26d49728 id: 4, name: "opiyo", role: "member">, #<NewUser:0x00007fca26d48ff8 id: 5, name: nil, role: "member">]
モデルで実際に定義していきます。
# new_user.rb class NewUser < ApplicationRecord extend Enumerize has_many :posts, dependent: :destroy enumerize :role, in: %i(admin member), default: :member, scope: true end
extend Enumerize
は書くの忘れるので注意です!
ここでもdefaultを指定しておくことで、オブジェクトを作った際にデフォルトで値が設定されます。
また、定義していない値でsave
するとvalidation
を書かなくてもエラーになります。
> user = NewUser.new => #<id: nil, name: nil, role: "member"> > user.role = 'opiyo' => "opiyo" > user.save (0.2ms) BEGIN (4.2ms) ROLLBACK => false > user.errors.full_messages => ["Roleは一覧にありません。"]
設定はこれだけです。日本語表示の対応をする場合はja.yml
への設定を行います。
# ja.yml ja: enumerize: new_user: role: admin: '管理者' member: 'メンバー'
よく使うメソッド
色々な取得方法がありますので、よく使うメソッドをrails c
で確認していきます。
> NewUser.role.options => [["管理者", "admin"], ["メンバー", "member"]] > NewUser.role.values => ["admin", "member"] > user = NewUser.new => <id: nil, name: nil, role: "member"> > user.role => "member" > user.role.member? => true > user.role.admin? => false > user.role.opiyo? NoMethodError: undefined method `opiyo?' for "member":Enumerize::Value > user.role_value => "member" > user.role_text => "メンバー" # scope: trueが必要 > NewUser.with_role(:member) SELECT "new_users".* FROM "new_users" WHERE "new_users"."role" = $1 [["role", "member"]] > NewUser.without_role(:member) SELECT "new_users".* FROM "new_users" WHERE "new_users"."role" NOT IN ('member')
formで使う(simple_form)
enumerize
を定義していると、簡単にセレクトボックスやラジオボタンが作れます。
.hoges__new-form = simple_form_for(@user, url: new_users_path) do |f| = f.input :name, placeholder: 'お名前', hint: 'フルネームでご記入してください。' = f.input :age = f.input :gender, collection: Hoge::GENDER, label: false, include_blank: '-----選択して下さい-----' # セレクトボックス = f.input :role # ラジオボタン = f.input :role, as: :radio_buttons # チェックボックス = f.input :role, as: :check_boxes = f.input :birthday .hoges__new-form-btn = f.submit
simple_form
の使い方はこちらにまとめていますので、どうぞ!