Rails

admin権限を持たせて、編集や消去などの権限を付与させる

どんなことがやりたい

現在、記事を投稿したユーザーのみが編集、消去の権限を持っているが、admin権限をもつユーザーのみ、全ての記事の消去などができるようにしたい

articles_controller.rb
class ArticlesController < ApplicationController



before_action :require_same_user, only: [:edit, :update, :destroy]



private


def require_same_user
        if current_user != @article.user
            flash[:danger] = "ログインしてください"
            redirect_to root_path
        end
    end
end
pry(main)> user = User.last
  User Load (0.2ms)  SELECT  "users".* FROM "users"  ORDER BY "users"."id" DESC LIMIT 1
=> #<User:0x007ff7a570c070
 id: 1,
 username: "アドミン権限を追加する",
 email: "signin@gmail.com",
 created_at: Sun, 18 Nov 2018 11:12:05 UTC +00:00,
 updated_at: Sun, 18 Nov 2018 23:12:35 UTC +00:00,
 password_digest: "???????????????????">

どうやるか

①usersテーブルにアドミン権限をデフォルトはなしで追加

rails g migration add_admin_to_users
201811◯◯◯◯◯◯◯_add_admin_to_users.rb
class AddAdminToUsers < ActiveRecord::Migration
  def change
    add_column :users, :admin, :boolean, default: false
#デフォルトではfalseが入るようにする
  end
end
rake db:migrate
rails c
user = User.last

pry(main)> user = User.last
  User Load (0.5ms)  SELECT  "users".* FROM "users"  ORDER BY "users"."id" DESC LIMIT 1
=> #<User:0x007ff7a79623b8
 id: 1,
 username: "アドミン権限を追加する",
 email: "signin@gmail.com",
 created_at: Sun, 18 Nov 2018 11:12:05 UTC +00:00,
 updated_at: Sun, 18 Nov 2018 23:12:35 UTC +00:00,
 password_digest: "???????????????????",
 admin: false>
pry(main)> user.admin?

=> flase


pry(main)> user.toggle!(:admin)
   (0.2ms)  begin transaction
  SQL (0.5ms)  UPDATE "users" SET "admin" = ?, "updated_at" = ? WHERE "users"."id" = ?  [["admin", "t"], ["updated_at", "2018-◯◯], ["id", 1]]
   (1.4ms)  commit transaction
=> true

pry(main)> user = User.last
  User Load (0.2ms)  SELECT  "users".* FROM "users"  ORDER BY "users"."id" DESC LIMIT 1
=> #<User:0x007ff7a570c070
 id: 1,
 username: "アドミン権限を追加する",
 email: "signin@gmail.com",
 created_at: Sun, 18 Nov 2018 11:12:05 UTC +00:00,
 updated_at: Sun, 18 Nov 2018 23:12:35 UTC +00:00,
 password_digest: "???????????????????",
 admin: true>
articles_controller.rb
class ArticlesController < ApplicationController



before_action :require_same_user, only: [:edit, :update, :destroy]



private


def require_same_user
        if current_user != @article.user and !current_user.admin?
#現在ログインしているユーザーが、記事を作成したユーザーか
#アドミン権限を持っていないユーザーの場合は下記になる
            flash[:danger] = "ログインしてください"
            redirect_to root_path
        end
    end
end

その他でやること

show.html.erb
<% if logged_in? && (current_user == @article.user || current_user.admin?) %>
#ログインをしているかつ、現在ログインしているユーザーが、記事を作成したユーザー、または、アドミン権限を持ってユーザーなら下記を表示する
 <%= link_to "編集する", edit_article_path(@article) %>
  <%= link_to "消去する", article_path(@article), method: :delete,
             data: { confirm: "本当に消していいですか?"} %>
<% end %>