enumの実装と日本語化
某プログラミングスクールの課題で、
enumの実装と、対応する日本語化の機能を実装しましたので、
そのやり方を投稿させていただきます。
<railsでの開発、haml記法を想定しています。>
※本記事が初投稿です
わかりにくい点が見受けられるかと思いますが、ご容赦ください。。。
enum実装の経緯
productsテーブル:statusカラム(integer型)の場合
statusカラムに保存されている情報(1、2など)を、変数を用いて表示させたかったが、
→ DBに格納されている数字で表示されてしまう
例)viewで「@product.status」と記載 → 1 が表示される・・・
これを、「@product.status」 → ”新品、未使用” などの日本語へ変換したい
実装方法
<前提として>
ruby 2.5.1
rails 5.2.3
なお、enum実装のメリットとしては、下記の2点が大きいと思います
・コードが読みやすくなる
・データの管理がやりやすい
それでは、段階を踏んで実装をしていきます。
##1. gem の導入
gem 'rails-i18n'
gem 'enum_help'
bundle install の実行
##2.モデル(product)にenumを記載
enum status:{
'---': 0, #---
unused: 1, #新品、未使用
nearly_unused: 2, #未使用に近い
not_injured: 3, #目立った傷や汚れなし
bit_injured: 4, #やや傷や汚れあり
injured: 5, #傷や汚れあり
bad: 6, #全体的に状態が悪い
}
今回はselectboxを作成するため、1~6の選択肢として記載。
選択されたstatusは、DBには1~6として格納される。
(記載した英語は、自由で大丈夫です)
##3. ja.ymlに変換したい日本語を記載
※ ja.yml がない場合は、 config>localsの下に作成してください。
ja:
enums:
product:
status:
'---': "---"
unused: "新品、未使用"
nearly_unused: "未使用に近い"
not_injured: "目立った傷や汚れなし"
bit_injured: "やや傷や汚れあり"
injured: '傷や汚れあり'
bad: '全体的に状態が悪い'
階層が綺麗になっていないと、日本語化出来ないので要注意
##4. viewに記載
= f.select :status, Product.statuses.keys.map {|k| [I18n.t("enums.product.status.#{k}"), k]}
Product : モデル名
statsues : カラム名(複数形にしてください)
keys.map {|k| [I18n.t("enums.product.status.#{k}"), k]}
→ 選択肢を1つ1つ取り出して、日本語に変換して並び替えるイメージです。
##5. 変数を表示する場合
statusに1が格納されている前提で、最後に'_i18n'を記載する
(enum 実装ナシ) @product.status → " 1 "
(enum実装アリ:日本語変換ナシ) 〃 → ”unused”
(enum実装アリ:日本語変換アリ) @product.status_i18n → ”新品、未使用”
最後に
DB設計の段階で、どのようにデータを管理するか、しっかり確認・詰めておくべきでした。。。
最初は、statusカラムの型をstringにしてしまったため、苦戦しました。
チーム開発半ばで、DBからデータを取って来た時に数字で表示されてしまって、
これは何とかしないといけないなと思ったことがスタートでした。
皆様のお役に立てれば幸いです