41
56

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

今回の管理者は管理者としての行動があまり多くないため、基本はエンドユーザーと同じ画面で、管理者権限持ちのユーザーの表示が変わるようにしました。
#前提
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を使って管理者用画面を作るべきだと思います。

41
56
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
41
56

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?