エンジニア目指すほしこのブログ

エンジニアめざすほしこが学んだことや考えていることをアウトプットするブログです。現在27歳、小売業従事者。『アマゾンエフェクト!: 「究極の顧客戦略」に日本企業はどう立ち向かうか』著者: 鈴木 康弘 を読んでプログラミングに興味を持ちました。

enumでフォームのプルダウンを作る!

enumを使ってプルダウンメニューを作る方法です。

今日理解できたと思うので、忘れないようにメモ!

 

f:id:hossy03:20200302201651p:plain

↑ゴールはこれです。こんな感じのプルダウンメニューを作ります。

手順は以下の通りです。

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に以下のように記述しました。

f:id:hossy03:20200302203525p:plain

(適切な英語がわからなかった・・・後でも変えられるから気にせず進みます)

 

2. 選択肢を日本語化する場合はgem 'enum_help'を導入→ja.ymlに日本語を書く

便利なgem 'enum_help'というのがあるらしい!

Gemfileにgem 'enum_help'って書いてbundle installすればOK

そしたらconfig/locales/ja.ymlをこんな感じで編集します。

enum:

    モデル名:

         カラム名:

               選択肢:

f:id:hossy03:20200302203849p:plain

そしたら●●_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です。