enumとI18nとのコンビでハマったので、覚書としてかきます。
環境
Ruby 2.6.3
Rails 5.2.3
アプリの概要
タスク管理アプリ。そのタスクに優先度(高・中・低)を実装するのが今回のテーマ。
enumの定義
app/models/task.rb
// 省略
enum priority: [:high, :medium, :low]
// 省略
こうかくことで、以下の公式リファレンスにあるとおり、先頭から0、1、2が自動的に割り当てられる。
enum公式リファレンス
I18nの定義
config/locales/ja.yml
ja:
// 省略
enums:
task:
priority:
high: 高
medium: 中
low: 低
// 省略
この階層がのちのち鍵になる。
実装
app/views/tasks/index.html.erb
<% @tasks.each do |task| %>
<tr>
// 省略
<th><%= t("enums.task.priority.#{task.priority}") %></th>
// 省略
</tr>
<% end %>
上記のように、ymlファイルの階層とおりドットで区切ることでI18nが反映することになる。
app/views/tasks/_form.html.erb
<%= form_with(model: @task, local: true ) do |form| %>
// 省略
<%= form.label :priority %>
<%= form.select :priority, Task.priorities.keys.map {|k| [t("enums.task.priority.#{k}"), k]} %>
// 省略
<% end %>
こちらはmapメソッドを使ってまとめた。
keysメソッドについてはコチラ
これにより、タスクの新規登録画面では以下のようなプルダウンメニューが実装できる。
enumの利点
そもそもenumはなんのために存在するのか。
- 数値で扱うことができるため、ソート処理が可能になる
- 「高・中・低」ではソートはできない
- 設定する値に対してバリデーション的な役目を果たす
- 「最低」や「最高」などは受け付けなくなる
enumでハマったら、ymlファイルの階層をチェックしましょう。