やまだゆう(@yamaday0u)です。
今回は、Railsのdevise gemでログイン認証機能(ユーザー管理機能)を実装済みのアプリに、管理者機能を追加する実装例をご紹介します。
※2022年から技術系の記事は個人ブログに投稿しております。ぜひこちらもご覧ください→yamaday0u Blog
目標
この記事では、
- deviseでログイン認証機能を実装済みのアプリに
- 新たなテーブルを追加せずに
- 管理者機能を実装すること
を目標にします。
管理者とユーザーのテーブルを別々に作りたい場合は以下のブログ記事を参考にしてください。
【Rails】deviseを使用して管理者と会員を作成する方法(初心者向け)(Nulfasのブログ)
前提
devise gemですでにユーザー管理機能を実装済み = ユーザーを管理するusersテーブルが存在していること。
usersテーブルには最低限の以下のカラムが存在しています。
カラム名 | データ型 |
---|---|
name | string |
string | |
encrypted_password | string |
実装のポイント
既存のusersテーブルにboolean型のadminカラムを追加して、adminカラムの値がtrueのユーザーを管理者とします。
手順
migrationファイルを作成
既存のusersテーブルにデータ型がboolaen型のadminカラム
を追加するためにmigrationファイルを作成します。
rails g migration add_admin_to_users admin:boolean
migrationファイルの編集&実行
作成したmigrationファイルに以下の通り記述します。
ここでのポイントは、初期値をdefault: false
で指定しているところです。
これによりusersテーブルの既存のレコードにも初期値がfalseの状態でadminカラムが追加されます。
class AddAdminToUsers < ActiveRecord::Migration[6.0]
def change
add_column :users, :admin, :boolean, default: false
end
end
ターミナルでマイグレートします。
rails db:migrate
管理者ユーザーを作成
管理者ユーザー(のレコード)をseeds.rb
ファイルを用いて作成します。
ここでのポイントはもちろん、adminカラムの値をtrue
にしていることです。
後の工程で、adminカラムの値がtrue
であるか否かを利用してログイン後のマイページの表示を切り替えます。
また、ぼくの場合、githubにアプリのソースコードを公開しているので、.env
というgemを使って、メールアドレスやパスワードは環境変数を定義して指定しました。
User.create!(
name: "管理者",
email: ENV['ADMIN_EMAIL'],
password: ENV['ADMIN_PASSWORD'],
password_confirmation: ENV['ADMIN_PASSWORD'],
admin: true
)
seedsファイルに記述した内容を実行します。
rails db:seed
これで、管理者ユーザーが作成、usersテーブルに登録されました。
Routeの定義
ぼくのポートフォリオアプリであるGroup Calendarを例にrouteの定義を説明します。
通常のユーザーであれば、ログイン後にconfig/routes.rbに定義したresources :calendars
によりマイページ(indexアクション)にリダイレクトします。
そこで管理者ユーザーの場合は、namespaceを利用して以下のように記述し、admin/calendars
をマイページのpathにして、管理者ページであることを明示的にしました。
namespace :admin do
# 以下の記述により、admin/calendarsへのpathが開かれます。
resources :calendars, only: %i[index]
end
Controllerの作成その1
routeの定義でadmin/calendars
というpathを開いたので、以下のようにAdmin::Calendars Controller
を作成します。
rails g controller admin/calendars
作成したcontrollerに以下の通り記述します。
class Admin::CalendarsController < ApplicationController
def index
# 省略
end
end
Controllerの作成その2
管理者ユーザーにはニュースリリース機能を使えるようにしたいので、News Controllerを作成します。
rails g controller news
作成したNews Controllerに以下のように記述します。
private actionかつbefore_actionのcheck_admin?
により、管理者以外のユーザーが管理者用のページであるニュースリリース関連機能のページを表示できないようにしています。
class NewsController < ApplicationController
before_action :check_admin?
def index
# 省略
end
# 中略
private
def check_admin?
unless current_user.admin
redirect_to root_path
end
end
end
View
Viewはこのように書きます。
ログイン中のユーザー(current_user)のadminカラムの値がtrue
なら、ニュースリリース機能関連のページへのリンクを表示します。
<% if current_user.admin? %>
<li><%= link_to "News Release", news_index_path %></li>
<% end %>
完成!!
以上でdeviseでログイン認証機能を実装済みのアプリに新たなテーブルを追加せずに管理者機能を実装する手順が完了しました。
ぼくのポートフォリオアプリでは、以下のように管理者ページにのみNews Release用のページリンクが表示されるようにしました。
Rails学習中のみなさまの参考になれば幸いです。
ポートフォリオ
未経験からのエンジニア転職に向けて作ったポートフォリオを公開しています。
よろしければ覗いて見てください。
Group Calendar