填寫表單時總會遇到一個困擾,那就是我們希望只有1,2,3,4選項可以選,但表格設定類型為integer僅僅能防止非整數以及文字資料輸入,依舊抵擋不了操作者輸入5,6,7,9999之類不在預期範圍的資料,這種時候就可以設定Enum限定操作者填入的資料內容,搭配下拉選單呈現選項。
此處以設定使用者身份示範:
添加欄位
如果在table上已經預留好欄位就可以直接跳到ENUM設定步驟,還沒有的就可以添加migration檔。
資料類型integer:我們要用去抓該項設定的key,所以要是整數。
設定一個default值:讓新增加的資料自帶預設值0,即默認為Enum的key為0的狀態。
1 | class AddRoleInUser < ActiveRecord::Migration[6.1] |
先用ENUM設定選項內容
找到要設定項目的Model設定Enum
1 | class User < ApplicationRecord |
設定完Enum,rails就會送你這幾個方法
1 | user.roles 查詢user的所有role |
應用表單輔助:options_for_select 做出下拉選單
這個是製作下拉選單內容的本體,可以放兩個參數
1 | options_for_select([ 選項內容 ],預設選項) |
其中第二個參數設定預設項,只要在選項內容找得到的key都可以設定,若是找不到的的選項則會顯示第一個選項為預設。
首先是固定顯示某個選項(可用於一般表單輸入)
1 | 以User所有的role設定的狀態2 |
可是狀態2是什麼並不直觀,所以有另一種寫法:
先在controller設定一個實體變數,取每個狀態的key(這裡為了凸顯下一招的厲害我故意打了一個底線),
1 | @roles_select_options = User.roles.keys.map do |key| |
用human_attribute_name幫選項內容整理一下,看起來會比較像人類的表達方式,開頭變成大寫,底線也會變成空格
1 | @roles_select_options = User.roles.keys.map do |key| |
接下來就是把剛剛做的實體變數塞進選項清單,這下就可以使用key來設定預設值了~這樣是不是比較直觀呢?
1 | 我要讓admin成為預設選項 |
那我只是要修改上次的資料呢?
萬一我的舊資料不是預設選項卻忘了改,那不是完了?
別擔心,只要讀取該筆資料的role塞進預設值參數就好了~
1 | <%= form.select :role, options_for_select(@roles_select_options, @user.role) %> |
感想:
學會Enum+下拉選單應用對資料的統一性非常的有幫助,再也不用害怕那些不按照規矩來的人了,繼續鑽研…