Posted at

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 %>