在 Rails 開發中,有時候我們會遇到要在表單中設計 select 的選項。select 吃的 collection 是個 Array 。通常我們會往往第一直覺的想法是將之塞到 model 的 CONSTANT 裡,再寫一個 class method 包裝起來,再寫自己的 collection Helper 叫出來。
會這樣設計的原因是:通常程式設計師會想要對一個值 assign 一個數字,又想要用一個英文字包裝它,以方便取用。
這樣設計的手法很常見,但其實這樣的設計一聞下來就有「壞味道」。我自己也是思考了這個問題好幾年,換了非常多寫法,直到最近終於想出一個比較好的方式去設計 select。
翻修
我設計出一個比較漂亮的方式去改寫這樣的 code。當中用到了 settings_logic 與 simple_form 這兩個 gem。
Simple Form
SettingsLogic
把數值塞到 settings
Rails 內建的 I18n
Model : Job
JobData.job_categories 拉出來會是這樣的內容:
{"other"=>0, "web_developer"=>1, "designer"=>2, "app_developer"=>3, "marketing_sales"=>4, "web_social_manager"=>5}
但 select 要吃的是: [["其他職缺", 0],["網站設計師",1]]
這樣的 Array。所以我們再用 map 去對 I18n 求值包裝。
Helper
最後是如何把 category_str
從 model 搬出來。
這樣很明顯是錯的
- 這應該是 view 要做的事。
- 應該善用 Ruby 的特性,而不是跑 each 比較拿數值。
利用 Ruby 的 Hash 的 key,從翻譯檔裡面拿出正確的中文。
其他
如果以後想拿數值:
可以這樣下:
-
JobData.job_categories[:designer]
=> 2
-
I18n.t("job_categories.designer")
=> "美術設計師"