おぴよの気まぐれ日記

おぴよの気まぐれ日記

岡山やプログラミング、ファッションのこと、子育てや人生、生き方についての備忘録。

【Rails】enumをさらに便利にしてくれるgem enumerize(日本語化も)

Ruby on RailsでEnum = 列挙型を使う時に色々と便利なGemenumerizeの紹介です。

enumは例えば、ユーザーの性別とか、ステータスとか複数の項目を持つデータを扱う際に使います。

Railsだけでもenumを扱うことは出来るのですが、enumerizeを使うと簡単に日本語表示できたりformを簡単に作れたり便利です。

使い方

Gemfileenumerizeを追加して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

enumerizeを使った色々なformの作り方
enumerizeを使った色々なformの作り方

simple_formの使い方はこちらにまとめていますので、どうぞ!

opiyotan.hatenablog.com