[Ruby on Rails]enumを用いたselectフォームの作成


selectを作る際に、選択肢が3つ程度のものであればoptionで記載しても良いかとは思いますが、多くなればコードが冗長になってしまいます。
enumを用いているカラムに対してであれば、スッキリ綺麗なコードで実装できます。

実装した機能

gyazoリンク
https://gyazo.com/67a692c100281014ff59426fa6eb1a53

enumとは

列挙型、列挙クラスといわれる。
本記事はenumについてではないため、ザックリとした説明になりますが、
自分の認識では、
わざわざ、tableを作成し、外部キーとして呼ばなくとも中身を持ったidとして管理できるもの

どんなものに使うのか?

enumを使う代表的なものといえば、都道府県でしょうか
optionで書くのも面倒ですし、テンプレを使ったとしても冗長で読みやすいコードとは言い難いですね。

product.rb
 enum delivery_prefecture:{
   "北海道":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
 }

このように記載することで、今回でいうdelivery_prefectureがidで管理されるようになります
migrationファイルはintegerにしておきましょう

selectフォームの作成

products/new.html.haml
 .form__group
   = f.label :delivery_prefecture do
     発送元の地域
     %span.form-description.form-require 必須
   = f.select :delivery_prefecture, Product.delivery_prefectures.keys,{include_blank: '選択してください'},{class: "exhibition__select"}

今回であれば

Product.delivery_prefectures.keys
モデル.カラム名(複数形).keys

この記述で選択肢に先ほどのenumの記述部分が適用されます。
注意としては、複数形にすることです。

ちなみに

{include_blank: '選択してください'}

によって何も選択されていない時に 選択してください と表示されるようにしています

おまけ

products/new.html.haml
 .form__group
   = f.label :delivery_days do
     発送までの日数
     %span.form-description.form-require 必須
   = f.select :delivery_days, Product.delivery_days.keys,{include_blank: '選択してください'},{class: "exhibition__select"}
product.rb
  enum delivery_days:{
    "1~2日で発送": 1,
    "2~3日で発送": 2,
    "3~7日で発送": 3,
  }

このようにカラム名に複数形が使われている場合(あまり望ましくないが、dayだと変なので今回は止むを得ず、、)は、そのままカラム名を記載するだけでうまく行きます。

最後に

本記事がQiita初投稿になります
アドバイス等いただけたら幸いです!