1
1

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 3 years have passed since last update.

[Rails] オリジナルの管理者機能を作る 管理者画面編

Posted at

はじめに

Railsで管理者機能をつけるならrails_admin、active_admin、Administrateといった便利なgemを使うのが一般的だと思いますが、
今回はgemを使わず自分の欲しい機能だけの1から自作したオリジナルの管理者機能を作っていこうと思います!

#目標
今回は管理者だけがアクセスできる管理者画面を作っていきます。

#実装
まず前提としてdeviseによるログイン機能が既に実装されていることとします。
流れとしては、

  1. Userテーブルにbooleanで一般ユーザーと管理者ユーザーの区別をつけるためのカラムを追加する。
  2. seedファイルを使って管理者ユーザーを作成
  3. routesに管理者ユーザー用のルートを追加
  4. 管理者ユーザー用のController、viewを作成
  5. 一般ユーザーが管理者ページにアクセスできないようにする。

こんな感じです。
それでは行こう!

1.カラムの追加

まずは、一般ユーザーか管理者ユーザーかを判断するためのカラムをdeviseによって追加されたUserテーブルに追加していきます。

ターミナル
rails g migration add_administrator_to_users admin:boolean

booleanを追加したいので作成されたmigrationファイルにdefault値を設定します。

db/migrate/20210625043921_add_administrator_to_users.rb
add_column :users, :administrator, :boolean, default: false
ターミナル
rails db:migrate

2.seeds.rbで管理者ユーザーの作成

seedファイルで管理者ユーザーを作成します。

db/seed.rb
User.create!(email: "email",
            password: "password",
            password_confirmation: "password",
            administrator: true)

Userテーブルにnameカラムを追加している場合はnameカラムも記入してください。
ここで大事なのはboolean値の値をtrueにしていることです。

ターミナル
rails db:seed

3. routesにadmin用のルートを追加

うっかり管理者ページを公開してたなんてことにならないようにnamespaseを使ってしっかり区別しておきましょう。

config/routes.rb
 namespace :administrator do
    resources :users, only: [:index]
  end

今回actionはindexだけにしていますがその辺は自分の用途に合わせてください。

4. admin用のController、viewを作成

namespace部分を忘れずに!

administrator/users_controller.rb

class Administrator::UsersDataController < ApplicationController
  def index
  end
end

viewを追加して表示させます。

administrator/users/index.html.haml
%h1 管理者専用画面
  1. 一般ユーザーが管理者ページにアクセスできないようにする。
    最後に管理者のみアクセスできるようControllerに制限をかけていきます。
administrator/users_controller.rb
class Administrator::UsersDataController < ApplicationController
  before_action :admin_user
  def index
  end
  
  private
    def admin_user
      redirect_to(root_url) unless current_user.administrator?
    end
end

Userテーブルに設定したadministratorがfalse
つまり一般ユーザーが管理者ページにアクセスしようとするとroot_pathにリダイレクトされるようになってます。

これで完成!

# おまけ
管理者ユーザーがログイン後管理者ページにそのままリダイレクトされるようにしたいなら以下をapplication_controllerに追加してください

application_controller.rb
class ApplicationController < ActionController::Base
  def after_sign_in_path_for(resource)
      if current_user.administrator?
        flash[:notice] = "管理者ユーザーとしてログインしました。"
        administrator_users_path
      else 
        root_path
      end
    end
end

これでログイン後一般ユーザーはトップページ、管理者ユーザーは今回作った管理者ページにリダイレクトされます。

まとめ

Userカラムにbooleanを持たせるだけでgemなしでも簡単に追加できますね。

1
1
0

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?