未経験からのフルスタックエンジニア

スキルをつけよう!未経験からフリーランスエンジニアへの成長記録

【Rails】enumでのセレクトボックス 作成~都道府県など~

できるようになること

都道府県などのセレクトボックスを、HTMLにベタ打ちしなくても作成できるようになります。

Image from Gyazo

enumとは

enumは文字列とint型、boolean型とを対応させることができる機能です。

つまり、enumを利用すると、データベースに保存された数字(int型を想定)と対応した文字列を返り値として出力できるようになります。

enumはモデルに定義して使います。モデルに数字と文字列との対応を定義することで、ビュー側にセレクトボックス の中身を全て記述しなくとも、enumを介して文字列を呼び出すことで、47都道府県のセレクトボックスでも1行のコードで記述することが可能になります。

具体例(都道府県セレクトボックス)

マイグレーションファイル

class CreateProducts < ActiveRecord::Migration[5.2]
  def change
    create_table :products do |t|
      t.integer :delivery_area, null: false, default: 0
    end
end

デフォルト値は0として定義する想定です。integer型でenum用のカラムを定義していきます。

モデル

class Product < ApplicationRecord
   enum delivery_area:{
     "---":0,
     北海道:1,青森県:2,岩手県:3,宮城県:4,秋田県:5,山形県:6,福島県:7,
     茨城県:8,栃木県:9,群馬県:10,埼玉県:11,千葉県:12,東京都:13,神奈川県:14,
     新潟県:15,富山県:16,石川県:17,福井県:18,山梨県:19,長野県:20,
     岐阜県:21,静岡県:22,愛知県:23,三重県:24,
     滋賀県:25,京都府:26,大阪府:27,兵庫県:28,奈良県:29,和歌山県:30,
     鳥取県:31,島根県:32,岡山県:33,広島県:34,山口県:35,
     徳島県:36,香川県:37,愛媛県:38,高知県:39,
     福岡県:40,佐賀県:41,長崎県:42,熊本県:43,大分県:44,宮崎県:45,鹿児島県:46, 
     沖縄県:47
   }
end

delivery_areaという名称でenumをモデルに定義します。ハッシュのキーがセレクトボックスに表示したい値。ハッシュのバリューがデータベースに保存される値です。

ビューファイル

= f.select :delivery_area, Product.delivery_areas.keys, {}, {class: 'hoge'}

第二引数でenumで定義した文字列を取り出しています。もう少し詳しく分解すると以下のようになります。

Product.delivery_areas
=>{"---"=>0, "北海道"=>1, "青森県"=>2, ...., "沖縄県"=>47}

ここまでで、モデルで定義したハッシュを取り出しています。名称が複数形になっていることに注意してください。

Product.delivery_areas.keys
=>["---", "北海道", ... "沖縄県"]

さらに.keysを加えることで、ハッシュのキーだけの配列を取り出せます。この配列を元にセレクトボックスを作成しています。

実際にhtmlに変換されたものが以下となっております。配列で指定した都道府県が

<select class="hoge" name="product[delivery_area]" id="product_delivery_area">
   <option selected="selected" value="---">---</option>
   <option value="北海道">北海道</option>
   <option value="青森県">青森県</option>
   <option value="岩手県">岩手県</option>
   <option value="宮城県">宮城県</option>
   <option value="秋田県">秋田県</option>
   <option value="山形県">山形県</option>
   <option value="福島県">福島県</option>
   <option value="茨城県">茨城県</option>
   <option value="栃木県">栃木県</option>
   <option value="群馬県">群馬県</option>
   <option value="埼玉県">埼玉県</option>
   <option value="千葉県">千葉県</option>
   <option value="東京都">東京都</option>
   <option value="神奈川県">神奈川県</option>
   <option value="新潟県">新潟県</option>
   <option value="富山県">富山県</option>
   <option value="石川県">石川県</option>
   <option value="福井県">福井県</option>
   <option value="山梨県">山梨県</option>
   <option value="長野県">長野県</option>
   <option value="岐阜県">岐阜県</option>
   <option value="静岡県">静岡県</option>
   <option value="愛知県">愛知県</option>
   <option value="三重県">三重県</option>
   <option value="滋賀県">滋賀県</option>
   <option value="京都府">京都府</option>
   <option value="大阪府">大阪府</option>
   <option value="兵庫県">兵庫県</option>
   <option value="奈良県">奈良県</option>
   <option value="和歌山県">和歌山県</option>
   <option value="鳥取県">鳥取県</option>
   <option value="島根県">島根県</option>
   <option value="岡山県">岡山県</option>
   <option value="広島県">広島県</option>
   <option value="山口県">山口県</option>
   <option value="徳島県">徳島県</option>
   <option value="香川県">香川県</option>
   <option value="愛媛県">愛媛県</option>
   <option value="高知県">高知県</option>
   <option value="福岡県">福岡県</option>
   <option value="佐賀県">佐賀県</option>
   <option value="長崎県">長崎県</option>
   <option value="熊本県">熊本県</option>
   <option value="大分県">大分県</option>
   <option value="宮崎県">宮崎県</option>
   <option value="鹿児島県">鹿児島県</option>
   <option value="沖縄県">沖縄県</option>
</select>

取得値

railsでカラムの値を取得した際の返り値は、数値ではなくて文字列となります。

product = Product.new
#Productインスタンス作成

product.delivery_area = 47
#delivery_areaの値を47にする

product.delivery_area = "沖縄県"
#delivery_areaの返り値を取得

注意点

同じモデル内で複数のenumを定義するとき、複数のenumで同じキー名を指定する場合注意が必要です。上記の書き方ではエラーが出てしまいます。

その時は、enumの定義の後、_suffixまたは_prefixというオプションを指定します。このオプションを指定することで、enum同士の区別がつくこととなり、エラーが無くなります。

enum hoge: {
   default:0, hoge:1
},_suffix: true

enum fuga: {
   default:0, fuga:1
},_suffix: true

詳細は以下の公式ページを参照してください。

api.rubyonrails.org

まとめ

enumを用いることで、セレクトボックスがスッキリ記述できます。

ぜひ活用していきましょう。