2
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

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

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ファイルの階層をチェックしましょう。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
2
Help us understand the problem. What are the problem?