Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
42
Help us understand the problem. What is going on with this article?

More than 1 year has passed since last update.

@NZTK

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

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

前提

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を使って管理者用画面を作るべきだと思います。

42
Help us understand the problem. What is going on with this article?
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
42
Help us understand the problem. What is going on with this article?