Ruby on Rails:善用enum及human_attribute_name方法印出易讀的下拉選單內容

ActiveRecord::Enum說明及使用

在開發各式各樣的網站時,常會遇到要實作下拉選單功能,如果下拉選單的選項不少,又需要存到資料庫表單中,為了方便,通常會設計各個選項用數字儲存,例如電商網站儲存訂單狀態,各種狀態可能就會用不同的整數存進訂單資料表的欄位,像下方這樣

human_attribute_name說明及使用

雖然使用enum後,Order的status已經可以顯示好懂的內容,但是似乎還不是一個好看的格式,例如not_paid這樣包含下底線的顯示似乎不太好看,想要讓這樣的格式升級成為更專業的樣子,這時候就可以使用ActiveRecord內建的另一個方法 — human_attribute_name,根據官方文件,human_attribute_name這個方法可以將model的屬性轉化為更為人性化的格式,例如”first_class”就會轉換為“First Class”,直接來看一下使用human_attribute_name方法後Order model這邊status屬性為not_paid的顯示結果

製作易讀的下拉選單

大致了解enum以及human_attribute_name如何使用,接著就可以利用他們來實作下拉選單的選項了,先單純使用enum提供的方法試試,把Order的status都印出來,作為下拉選單的項目,程式碼可能會像下面這樣

創建model共用模組印出選單選項

基於現實的開發狀況,專案中應該不只一個model會需要實作下拉選單,假設Order model還有一個欄位shipment_mode也是要做下拉選單,還有Product model也有欄位category也可能有此需求,若兩個model都個去寫一段程式組出下拉選單內容,感覺好像是做重複的事情,寫重複的程式,不符合Ruby的風格 — Don’t repeat yourself,這時可以統一寫一個模組,內建組出enum及human_attribute_name轉換結果的方法, 之後model引用這個模組再呼叫同一個方法就可以組出各自需要的選單內容,得到像Order model的欄位status下拉選單選項的資料格式

[[“Not paid”, “not_paid”], [“Paid”, “paid”], [“Shipping”, “shipping”], [“Deliverd”, “deliverd”], [“Returned”, “returned”], [“Refunded”, “refunded”]]

參考資料:

ActiveRecord::Enum官方文件

--

--

Programming Skill learner and Sharer | Ruby on Rails | Golang | Vue.js | Web Map API

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
icelandcheng

icelandcheng

67 Followers

Programming Skill learner and Sharer | Ruby on Rails | Golang | Vue.js | Web Map API