今回はECサイトの制作をしていた際の注文ステータスのカラムにenumを使用し、プルダウン表記を活用しました。enumを使用することが初めてであったので、忘れない様に自身のメモとして記事を残したいと思います。
以下の記事は実装の際に参考にさせていただきました。
(参考記事)
・【初心者向け】i18nを利用して、enumのf.selectオプションを日本語化する[Rails]
https://qiita.com/tanutanu/items/d44a92425188a4489ec6
・[初学者]Railsのi18nによる日本語化対応
https://qiita.com/shimadama/items/7e5c3d75c9a9f51abdd5
開発環境
ruby 2.6.3
Rails 5.2.4.4
Gemfile
gem 'enum_help'
bundle install
まずは、enumを使用するのに必要なgemをGemfileに記述します。
上記のように記述ができたら、ターミナルでbundle installのコマンドを実行します。
model.rb
enum production_status: {cannot_be_started: 0, waiting_for_production: 1, in_production: 2, production_completed: 3}
次にモデルのファイルに記述を加えます。
enum カラム名: {名前(今回はステータス名): 0, 名前(今回はステータス名):1 ... n }
enumの後には、enumを使用するカラム名と波カッコ内にはその名目(英語表記)と各値に0から順に数字を振っていきます。
このように各名目に数字を対応させるため、テーブルを作成する際のenumのデータ型はinteger(整数型)となります。
日本語の設定に変更する
module NaganoApp
class Application < Rails::Application
# Initialize configuration defaults for originally generated Rails version.
# config.load_defaults 5.2
config.i18n.default_locale = :ja #この1行のみ追加
# Settings in config/environments/* take precedence over those specified here.
# Application configuration can go into files in config/initializers
# -- all .rb files in that directory are automatically loaded after loading
# the framework and any gems in your application.
end
end
この1行の記載がないと日本語表記に変換されません。
ja:
enums:
order_item:
production_status:
cannot_be_started: "着手不可"
waiting_for_production: "制作待ち"
in_production: "制作中"
production_completed: "制作完了"
先ほどのmodelファイルの内容を日本語訳をして記述します。
断層やカラム名の記述に誤りがあると、表示されなくなってしまいます。
viewに表示する
<%= form_with model: @order_item, url: admin_order_item_path(order_item), method: :patch, local: true do |f| %>
<%= f.select :production_status, OrderItem.production_statuses.keys.map {|k| [I18n.t("enums.order_item.production_status.#{k}"), k]} %>
<%= f.submit "変更" %>
<% end %>
フォーム内にプルダウン表記でステータスを変更できるようにしました。
f.select以降は以下のような構成になっており、こちらもカラム名の単数、複数表記を誤ると表示がされなくなります。
:カラム名(単数形), モデル名.カラム名(複数形).keys.map {|k| [I18n.t("enums.モデル名.カラム名(単数形).#{k}"), k]} %
keys.map以降の表記により、設定されているenumの値の0から順に選択肢を入れてくれているようなイメージになります。
enumのメリット
今回のようにステータス管理など頻繁に更新が必要な際には特に有効な機能になります。
数値で管理を行うため、何か変更する必要がある時でも修正が容易に行えることが大きなメリットです。
model側とviewに必要な記述を少し書き加えるだけで、アプリケーション全体に変更を行うことが可能です。
終わり
今回は以上になります。
私自身もプログラミング初心者ですが、同じ様な立場の方に少しでも参考になれば幸いです。
また、もし内容に誤りなどがございましたら、ご指摘いただけますと幸いです。