Help us understand the problem. What is going on with this article?

[初心者]Railsで管理者権限付与してみた

More than 1 year has passed since last update.

今回の管理者は管理者としての行動があまり多くないため、基本はエンドユーザーと同じ画面で、管理者権限持ちのユーザーの表示が変わるようにしました。

前提

devise を使用してのUser登録機能作成済み

環境

Ruby 2.5.5
Rails 5.2.3

カラム追加

Userにrails g migration: AddColumnToUser admin:booleanでadminカラムを追加します。

xxx_add_column_to_users.rb
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 = trueuser.admin = falseに変えてあげるだけです。

Viewで判断

管理者権限を与えられたら、次に管理者かどうかを判断する条件分岐文をview側で書いてあげます。今回は管理者と本人ユーザーのみに編集ページへのリンクボタンを表示されるようにしました。
ボタンを置きたいページのcontrollerviewに以下の文を書きます。

controller
@user = User.find(params[:id])
view
<% 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を作ります。

users_controller
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を使う段階でenduseradminの二つに分けてログイン機能を作り、namespaceを使って管理者用画面を作るべきだと思います。

NZTK
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした