【rails】セレクトボックスの日本語化

※本サイトで紹介している商品・サービス等の外部リンクには、アフィリエイト広告が含まれる場合があります。

セレクトボックスを日本語化する

以前、セレクトボックスを使ってプロフィールの性別を選択した

セレクトボックスの選択肢は英語で、プロフィールに反映している性別も英語のままになってしまっている

今回やりたいこと

  1. セレクトボックスで選択した性別を、プロフィールで日本語表記させる
  2. セレクトボックスの選択肢も日本語表記にする

プロフィールを日本語表記にする

enum.ja.ymlに日本語表記を書く

config/locales/enum.ja.ymlのファイルを作る

日本語表記したい言葉を書き込む

ja:
  enum:
    genders:
      male: '男性'
      female: '女性'
      other: 'その他'

enum.ja.ymlで定義した日本語表記を、そのまま反映させる場合は以下のように書く

#{I18n.t("enum.genders.female")})
 # => 女性

enum.ja.ymlファイルから、enumgendersfemaleの値を表示している

femaleの部分を汎用的にすると良さそう


viewの表示方法を修正する

app/views/profiles/show.html.hamlのコードを書き換える

↓ 今、セレクトボックスで「female」を選択した場合

#{current_user.gender})
 # => female

セレクトボックスでの選択肢が英語のまま表示される

セレクトボックスでcurrent_userが選択したgenderを日本語表記にする

#{I18n.t("enum.genders.#{current_user.gender}")}

プロフィールの性別が日本語表記になった!


セレクトボックスも日本語表記にする

セレクトボックスの仕組み

選択肢として、[['男性', 'male'], ['女性', 'female'], ['その他', 'other']]の配列を用意する

= f.select :gender, [['男性', 'male'], ['女性', 'female'], ['その他', 'other']],
 {}, { class: 'text' }

セレクトボックス

検証画面

  • labelは「男性」「女性」「その他」と表示される
  • valueは「male」「female」「other」と送信される

この配列をどうやって作るのか??


配列を作るには「map」を使う

すでにある配列を作り変えるには「map」を使う

Profile.genders.map { | k, v | [ I18n.t("enum.genders.#{k}"), k ] }

例)セレクトボックスで「famale」を選択した場合

【前提】profile.rbにてenum gender: { male: 0, female: 1, other: 2 }と定義されている

  1. { | k, v |
    → 配列のkeyfemale」、value1」を取得する
  2. [ I18n.t("enum.genders.#{k}"),
    → keyfemale」をlabelにしたいので日本語表記にする
     ※"enum.genders.#{k}"は、"enum.genders.female"の意味になる
  3. k ] }
    → keyfemale」をvalueに入れて送信する


セレクトボックスの選択肢を日本語化するには

  1. どれがlabelとvalueにあたるのか理解する
  2. mapで配列を作り変える

#DAY24

【rails】表記の変更(yml)まとめ