enumでフォームのプルダウンを作る!
enumを使ってプルダウンメニューを作る方法です。
今日理解できたと思うので、忘れないようにメモ!
↑ゴールはこれです。こんな感じのプルダウンメニューを作ります。
手順は以下の通りです。
1. モデルにenumを使って選択肢を記述(選択肢は英語で記述)
2. 選択肢を日本語化する場合はgem 'enum_help'を導入→ja.ymlに日本語を書く
3. f.selectでプルダウンさせる
1. モデルにenumを使って選択肢を記述(選択肢は英語で記述)
モデルに、
enum [:選択肢1, :選択肢2, :選択肢3] と書く
もしくは
enum: {選択肢1: 0, 選択肢2: 1, 選択肢3: 2} と書く
前者の書き方だと、選択肢1→0、選択肢2→1、、、と書いた順で番号が与えられる。
という訳で、私は前者の方法でmodel/product.rbに以下のように記述しました。
(適切な英語がわからなかった・・・後でも変えられるから気にせず進みます)
2. 選択肢を日本語化する場合はgem 'enum_help'を導入→ja.ymlに日本語を書く
便利なgem 'enum_help'というのがあるらしい!
Gemfileにgem 'enum_help'って書いてbundle installすればOK
そしたらconfig/locales/ja.ymlをこんな感じで編集します。
enum:
モデル名:
カラム名:
選択肢:
そしたら●●_i18nで呼び出せるらしい。
上記のコードの場合、product.product_condition_i18n → "新品、未使用"(product_condition: 0の場合)となるようです。
これで日本語化できたので、あとはビューでselectでプルダウンします!
3. f.selectでプルダウンさせる
コードは以下の通りになります。
= f.select :カラム名, モデル名.カラム名s_i18n.keys.map{|k|[I18n.t("enum.モデル名.カラム名.#{k}"), k]}
カラム名s(ここではproduct_conditions)というのはproduct_conditionsという配列で、keysメソッドを使って.keysとすることでキーだけ("brand_new"などだけ)を配列にして取り出しているということみたいです。さらにmapメソッドにより一つ一つの値が処理されています。
mapメソッド:https://uxmilk.jp/21695
最終的なコードは以下のようになりました。
= f.select :product_condition, Product.product_conditions_i18n.keys.map{|k| [I18n.t("enum.product.product_condition.#{k}"), k]}, {prompt: true}, {class: "〜"}
prompt: trueとすることで"選択してください"と表示ができます。
またクラス名をつけるならpromptの後に{class: "〜"}って書いたらOKです。