LoginSignup
1
1

More than 1 year has passed since last update.

deviseでユーザー機能実装済みのアプリに管理者機能を追加

Last updated at Posted at 2021-10-11

やまだゆう(@yamaday0u)です。

今回は、Railsのdevise gemでログイン認証機能(ユーザー管理機能)を実装済みのアプリに、管理者機能を追加する実装例をご紹介します。

※2022年から技術系の記事は個人ブログに投稿しております。ぜひこちらもご覧ください→yamaday0u Blog

目標

この記事では、

  1. deviseでログイン認証機能を実装済みのアプリに
  2. 新たなテーブルを追加せずに
  3. 管理者機能を実装すること

を目標にします。

管理者とユーザーのテーブルを別々に作りたい場合は以下のブログ記事を参考にしてください。
【Rails】deviseを使用して管理者と会員を作成する方法(初心者向け)(Nulfasのブログ)

前提

devise gemですでにユーザー管理機能を実装済み = ユーザーを管理するusersテーブルが存在していること。
usersテーブルには最低限の以下のカラムが存在しています。

カラム名 データ型
name string
email 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カラムが追加されます。

db/migrate/2021XXXXXXXXXX_add_admin_to_users.rb
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を使って、メールアドレスやパスワードは環境変数を定義して指定しました。

db/seeds.rb
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にして、管理者ページであることを明示的にしました。

config/routes.rb
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に以下の通り記述します。

app/controllers/admin/calendars_controller.rb
class Admin::CalendarsController < ApplicationController

  def index
    # 省略
  end

end

Controllerの作成その2

管理者ユーザーにはニュースリリース機能を使えるようにしたいので、News Controllerを作成します。

ターミナル
rails g controller news

作成したNews Controllerに以下のように記述します。
private actionかつbefore_actionのcheck_admin?により、管理者以外のユーザーが管理者用のページであるニュースリリース関連機能のページを表示できないようにしています。

app/controllers/news_controller.rb
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なら、ニュースリリース機能関連のページへのリンクを表示します。

app/views/news/_link_to_news_release_page.html.erb
<% if current_user.admin? %>
  <li><%= link_to "News Release", news_index_path %></li>
<% end %>

完成!!

以上でdeviseでログイン認証機能を実装済みのアプリに新たなテーブルを追加せずに管理者機能を実装する手順が完了しました。

ぼくのポートフォリオアプリでは、以下のように管理者ページにのみNews Release用のページリンクが表示されるようにしました。

管理者ユーザーのマイページ
スクリーンショット 2021-10-11 21.11.11.png

一般ユーザーのマイページ
スクリーンショット 2021-10-11 21.12.05.png

Rails学習中のみなさまの参考になれば幸いです。

ポートフォリオ

未経験からのエンジニア転職に向けて作ったポートフォリオを公開しています。
よろしければ覗いて見てください。
Group Calendar

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