できるようになること
都道府県などのセレクトボックスを、HTMLにベタ打ちしなくても作成できるようになります。
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
詳細は以下の公式ページを参照してください。
まとめ
enumを用いることで、セレクトボックスがスッキリ記述できます。
ぜひ活用していきましょう。