LoginSignup
12
6

More than 3 years have passed since last update.

enumとI18nの実装はymlファイルの階層が鍵だった件

Last updated at Posted at 2019-06-16

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メソッドについてはコチラ

これにより、タスクの新規登録画面では以下のようなプルダウンメニューが実装できる。
スクリーンショット 2019-06-16 16.37.31.png

enumの利点

そもそもenumはなんのために存在するのか。

  • 数値で扱うことができるため、ソート処理が可能になる
    • 「高・中・低」ではソートはできない
  • 設定する値に対してバリデーション的な役目を果たす
    • 「最低」や「最高」などは受け付けなくなる

enumでハマったら、ymlファイルの階層をチェックしましょう。

12
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
6