LoginSignup
4
11

More than 3 years have passed since last update.

【enum】リソースの状態を表す

Last updated at Posted at 2018-05-20

enumとは

リソースの区分けや状態を示すのに利用されます。

例えばbookを投稿し、それをみんなで共有できるものがあるとします。
そして投稿されているbookの投稿者が、そのbookを公開・非公開設定できるものとします。

今回で言えば、bookというリソースの中で公開・非公開という状態区分けがあります。
enumを使うことでこのような機能を簡単に作ることができます。

enumの使い道

今回必要になる状態は、公開状態と非公開状態です。
その場合の設定手順は以下になります。

まず、bookテーブルにstatusカラムを追加します。
下のenumで定義していますが、投稿したらそのまま公開状態にしたいのでデフォルトを1にします。

#ターミナル
rails g migration AddStatusToBooks status:integer


#migrationファイル
  def change
    add_column :books, :status, :integer, default: 1, null: false, limit: 1
  end

次にenumを追加します。

book.rb
enum status:{nonreleased: 0, released: 1}

ここでは公開するという英語であるreleaseを使います。さらにedをつけることで状態を表します。
非公開状態を0とし、公開状態を1とします。

こうすることで様々なメソッドがつけるようになります。
そのメソッドの種類についてはこちらの記事が非常に参考になります。

Rails enumについてまとめておく

そして、最後に公開・非公開ボタンを押せばそのbookの状態を変えられるようにします。

books_controller.rb

  def release
    book =  Book.find(params[:id])
    book.released! unless book.released?
    redirect_to edit_book_path(book), notice: 'この作品を公開しました'
  end

  def nonrelease
    book =  Book.find(params[:id])
    book.nonreleased! unless book.nonreleased?
    redirect_to edit_book_path(book), notice: 'この作品を非公開にしました'
  end

edit.html.erb
<% if @book.released? %>
  <%= link_to '非公開にする', nonrelease_book_path(@book), method: :patch %>
<% else %>
  <%= link_to '公開する', release_book_path(@book), method: :patch %>
<% end %>

公開非公開機能の完成です。

enumのメリット

1.便利なメソッドを自動生成してくれる。
上の記事を見ていただければいいのですが、便利なメソッドがたくさん作り出されます。
インスタンスにreleased!とかをつけるだけでカラムを変更できたり、released?をつければtrueやfalseを返してくれます。簡単にカラムの値を調べたり、変更できたりできるのは非常にやりやすいです。

2.マジックナンバーを使わなくて済む。
どちらかというと、こちらの方が自分的には大きな理由ですが、マジックナンバーを使わなくて済みます。
マジックナンバーはプログラムを書いた人にしかわからない数字のことです。
上のedit.html.erbにある、if @book.released?もif @book.status == 1と無理矢理書くこともできますが、1ってなんやねん!?となりますよね。でもreleased?と書かれていれば感覚的に意味がわかります。他の人たちと共有して仕事するときに可読性を上げられます。

4
11
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
4
11