どうした?
ToDoアプリを作成しています。
各Todoに対して
- waiting(未着手)
- working(仕掛中)
- done(完了)
の選択肢を持ったstatus
カラムを付与する時に便利になりそうなenumerize gemを導入し、設定する方法をアウトプットします。
手順
gemのインストール
Gemfileにenumerizeを記載します。
gem 'enumerize'
記載したらbundle install
しましょう。
モデルに選択肢を設定
マイグレーションファイル
マイグレーションファイルにて、Todoモデルにstatus
カラムを付与する指示を与えます。
このとき、新規レコード作成時にバリデーションに引っかかるのを防ぐためにデフォルト値を指定すると良いでしょう。
t.string :status, null: false, default: :waiting
モデル
モデルファイルでstatus
の選択肢を配列形式で与えます。
Enumerizeモジュールの呼び出しも忘れずにおこないましょう。
extend Enumerize
enumerize :status, in: %i(waiting working done)
seed(おまけ)
サンプルデータを作るときのコツです。
例えば100個のデータにstatus
をランダムで与えたいとき、次のように指定します。
todos_array = []
100.times do
statuses = %w(waiting working done)
todos_array << {
# 略
status: statuses[rand(3)]
}
end
Todo.create!(todos_array)
rand(n)
は0~n-1の間の整数をランダムに返すメソッドです。
statuses
は配列なので、statuses[n]
は配列のn番目を出力します。
この値をstatus
カラムに指定すれば、ランダムなステータスを代入することができます。
日本語設定
選択肢を日本語設定しましょう。
config/locales/ja.yml
に以下のように指示します。
ja:
# 略
enumerize:
todo:
status:
waiting: 未着手
working: 仕掛中
done: 完了
確認
rails c
でコンソールに入り、選択肢を確認します。
Todo.status.options
=> [["未着手", "waiting"], ["仕掛中", "working"], ["完了", "done"]]
無事に3つの選択肢が設定されていることが確認できました。
さらに、設定した値は以下の方法で取得することができます。
todo = Todo.first
# statusの物理値をそのまま出力
todo.status
=> "waiting"
# statusの値を日本語で出力
todo.status_text
=> "未着手"
選択肢フォームに実装
html.erbファイルで選択肢フォームを実装するときは、form_with
ブロックの中で下記のように指定します。
<%= f.select :status, Todo.status.options %>
このとき、オプションにはTodo.status.options
を指定していることに注目してください。
これにより、以下のようなHTMLが出力されます。
<select name="status" id="status">
<option value="waiting">未着手</option>
<option value="working">仕掛中</option>
<option value="done">完了</option>
</select>
これにより、日本語で選択し、物理名で登録することができます。
これは、Todo.status.options
が["日本語表記", "物理名"]
の配列からなる配列になっているためです。
つまり、上のフォームを展開すると以下のようになります。
<%= f.select :status_text, [["未着手", "waiting"], ["仕掛中", "working"], ["完了", "done"]] %>
詳しくは下の記事と形を比べてみましょう。
まとめ
以上でRailsでenumerize gemを導入し、モデルのカラムを選択肢から選べるようになりました。
enumerize gemは本記事で紹介した以外にも独自メソッドを持ちます。
機能を最大限に使いこなせるようになりたいです。
参考