はじめに
Railsで管理者機能をつけるならrails_admin、active_admin、Administrateといった便利なgemを使うのが一般的だと思いますが、
今回はgemを使わず自分の欲しい機能だけの1から自作したオリジナルの管理者機能を作っていこうと思います!
#目標
今回は管理者だけがアクセスできる管理者画面を作っていきます。
#実装
まず前提としてdeviseによるログイン機能が既に実装されていることとします。
流れとしては、
- Userテーブルにbooleanで一般ユーザーと管理者ユーザーの区別をつけるためのカラムを追加する。
- seedファイルを使って管理者ユーザーを作成
- routesに管理者ユーザー用のルートを追加
- 管理者ユーザー用のController、viewを作成
- 一般ユーザーが管理者ページにアクセスできないようにする。
こんな感じです。
それでは行こう!
1.カラムの追加
まずは、一般ユーザーか管理者ユーザーかを判断するためのカラムをdeviseによって追加されたUserテーブルに追加していきます。
rails g migration add_administrator_to_users admin:boolean
booleanを追加したいので作成されたmigrationファイルにdefault値を設定します。
add_column :users, :administrator, :boolean, default: false
rails db:migrate
2.seeds.rbで管理者ユーザーの作成
seedファイルで管理者ユーザーを作成します。
User.create!(email: "email",
password: "password",
password_confirmation: "password",
administrator: true)
Userテーブルにnameカラムを追加している場合はnameカラムも記入してください。
ここで大事なのはboolean値の値をtrueにしていることです。
rails db:seed
3. routesにadmin用のルートを追加
うっかり管理者ページを公開してたなんてことにならないようにnamespase
を使ってしっかり区別しておきましょう。
namespace :administrator do
resources :users, only: [:index]
end
今回actionはindexだけにしていますがその辺は自分の用途に合わせてください。
4. admin用のController、viewを作成
namespace部分を忘れずに!
class Administrator::UsersDataController < ApplicationController
def index
end
end
viewを追加して表示させます。
%h1 管理者専用画面
- 一般ユーザーが管理者ページにアクセスできないようにする。
最後に管理者のみアクセスできるようControllerに制限をかけていきます。
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
に追加してください
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なしでも簡単に追加できますね。