今回の管理者は管理者としての行動があまり多くないため、基本はエンドユーザーと同じ画面で、管理者権限持ちのユーザーの表示が変わるようにしました。
#前提
devise を使用してのUser登録機能作成済み
#環境
Ruby 2.5.5
Rails 5.2.3
#カラム追加
Userにrails g migration: AddColumnToUser admin:boolean
でadminカラムを追加します。
class AddColumnToUsers < ActiveRecord::Migration[5.2]
def change
add_column :users, :admin, :boolean , default: false
end
end
管理者権限は基本的には付与されないのでmigrationファイルに default: false
を追加します。
rails db:migrate
を実行します。
#管理者権限付与
今回はすでにいるUserに管理者権限を付与させていきます。
rails c
でコンソール画面にいき、
user = User.find(1)
user.admin = true
user.save
これでUser1に管理者権限が付与されました。
管理者権限を剥奪したい場合はuser.admin = true
をuser.admin = false
に変えてあげるだけです。
#Viewで判断
管理者権限を与えられたら、次に管理者かどうかを判断する条件分岐文をview側で書いてあげます。今回は管理者と本人ユーザーのみに編集ページへのリンクボタンを表示されるようにしました。
ボタンを置きたいページのcontrollerとviewに以下の文を書きます。
@user = User.find(params[:id])
<% if user_signed_in? %>
<% if current_user == @user || current_user.admin? %>
<%= link_to "編集", edit_user_path(@user.id) %>
<% end %>
<% end %>
解説します。
まず<% if user_signed_in? %>
でユーザーがサインインしているかどうかを調べ、一つ目の条件分岐とします。これでログイン済みユーザーのみが次の<% if current_user == @user || current_user.admin? %>
へと進めるようになりました。
<% if current_user == @user || current_user.admin? %>
で現在のユーザーが@userかどうか、もしくはadminカラムがtrueかfalseかを調べます。
これで現在のユーザーが@userか、admin = true
の場合は編集ページへのリンクが表示され、そうでない場合は何も表示されない状態ができました。
#Controllerで判断
管理者のみが閲覧できる特定のViewを作ります。
class UsersController < ApplicationController
before_action user_admin, only: [:index]
def index
@users = User.all
end
private
def user_admin
@users = User.all
if current_user.admin == false
redirect_to root_path
else
render action: "index"
end
end
end
UsersControllerに以上の記述をすることで、index
にはadminカラムがtrueのユーザーのみがリンクできるようになり、adminカラムがfalseのユーザーは/
に指定したページへとリダイレクトされるようになりました。
#まとめ
今回は管理者のやることが少ない前提で管理権限を付与しましたが、本来ならdevise
を使う段階でenduser
とadmin
の二つに分けてログイン機能を作り、namespace
を使って管理者用画面を作るべきだと思います。