【Rails7】Deviseでユーザー(user)と管理者(admin)を分けてログインできるようにする

Webサービスを運営するのであれば、少なくともユーザーアカウントと管理者アカウントの最低2つは要する必要があるかと思います。

そこで、今回はDeviseを使ってユーザーアカウント(user)と管理者アカウント(admin)を分けて作成、認証(マルチログイン)する方法についてまとめてみました。

参考になれば幸いです。

目次

開発環境

  • Ruby 3.1.2
  • Ruby on Rails 7.0.4
  • tailwindcss 3.1.8
  • M1 Macbook Air 2020
  • mac OS Monterey (ver. 12.4)
  • ターミナル bash (Rosetta 2 使用

deviseで複数アカウントを作成する手順

それでは順番に解説していきます。

Deviseのインストール

まずはGemfileに下記のように記述します。

gem 'devise'

以下のコマンドでgemをインストールします。

$ bundle install

続いて、以下のコマンドでDevise本体をインストールします。

$ rails g devise:install

Deviseのインストールが完了すると、ターミナルに以下のような表示が出ます。

===============================================================================

Depending on your application's configuration some manual setup may be required:

  1. Ensure you have defined default url options in your environments files. Here
     is an example of default_url_options appropriate for a development environment
     in config/environments/development.rb:

       config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }

     In production, :host should be set to the actual host of your application.

     * Required for all applications. *

  2. Ensure you have defined root_url to *something* in your config/routes.rb.
     For example:

       root to: "home#index"
     
     * Not required for API-only Applications *

  3. Ensure you have flash messages in app/views/layouts/application.html.erb.
     For example:

       <p class="notice"><%= notice %></p>
       <p class="alert"><%= alert %></p>

     * Not required for API-only Applications *

  4. You can copy Devise views (for customization) to your app by running:

       rails g devise:views
       
     * Not required *

===============================================================================

Devise設定ファイルの変更

config/initializers/devise.rbの中の、「# config.scoped_views = false」の部分を以下のように書き換えます。

config.scoped_views = true

Deviseはデフォルトで全てのモデルに同じビューを使用しているため、上記のようにすることでモデルごとに別々のビューを使用できるようになります。(adminとuserそれぞれ別のビューを使用できるようになる)

「admin」と「user」モデルの作成

以下のコマンドを実行して「admin」モデルと「user」モデルを作成します。

$ rails g devise admin
$ rails g devise user

モデル作成時にマイグレーションファイルが作成されるので、変更がなければマイグレーションを実行します。

カラムの追加やConfirmableの設定などをしておきたい場合は、マイグレーション実行前に以下のようにマイグレーションファイルを書き換えておきましょう。

# frozen_string_literal: true

class DeviseCreateUsers < ActiveRecord::Migration[7.0]
  def change
    create_table :users do |t|
      ## Database authenticatable
      t.string :name  # ←nameカラムを追加する場合は追記する
      t.string :email,              null: false, default: ""
      t.string :encrypted_password, null: false, default: ""

      ## Recoverable
      t.string   :reset_password_token
      t.datetime :reset_password_sent_at

      ## Rememberable
      t.datetime :remember_created_at

      ## Trackable
      # t.integer  :sign_in_count, default: 0, null: false
      # t.datetime :current_sign_in_at
      # t.datetime :last_sign_in_at
      # t.string   :current_sign_in_ip
      # t.string   :last_sign_in_ip

      # Confirmable  # ↓メール認証を有効にする場合はコメントアウトを外す
      t.string   :confirmation_token
      t.datetime :confirmed_at
      t.datetime :confirmation_sent_at
      t.string   :unconfirmed_email # Only if using reconfirmable

      ## Lockable
      # t.integer  :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts
      # t.string   :unlock_token # Only if unlock strategy is :email or :both
      # t.datetime :locked_at


      t.timestamps null: false
    end

    add_index :users, :email,                unique: true
    add_index :users, :reset_password_token, unique: true
    # add_index :users, :confirmation_token,   unique: true
    # add_index :users, :unlock_token,         unique: true
  end
end

書き換えたらマイグレーションを実行します。

$ rails db:migrate

コントローラーの作成

続いて、以下のコマンドでコントローラーを作成します。

$ rails g devise:controllers admins
$ rails g devise:controllers users

※コントローラーなので複数形で!

ビューの作成

以下のコマンドでビューを作成します(こちらも複数形で)。

$ rails g devise:views admins
$ rails g devise:views users

ルーティング設定

最後にルーティングの設定を行います。

現状のルーティング設定は以下のようになっているかと思います。

Rails.application.routes.draw do
  ・・・
  devise_for :users
  devise_for :admins
end

しかし、この状態のままだと個別に追加したコントローラーを参照してくれません(Deviseデフォルトのコントローラーを参照してしまう)。

そこで、以下のように記述を変更することで各モデルに対応したコントローラーを参照するようになります。

Rails.application.routes.draw do
  ・・・
  devise_for :admins, controllers: {
    # ↓ローカルに追加されたコントローラーを参照する(コントローラー名: "コントローラーの参照先")
    registrations: "admins/registrations",
    sessions: "admins/sessions",
    passwords: "admins/passwords",
    confirmations: "admins/confirmations"
  }
  devise_for :users, controllers: {
    # ↓ローカルに追加されたコントローラーを参照する(コントローラー名: "コントローラーの参照先")
    registrations: "users/registrations",
    sessions: "users/sessions",
    passwords: "users/passwords",
    confirmations: "users/confirmations"
  }
end

以上です。

Railsバージョン7でDeviseを利用する場合

現状(2023年1月11日時点)では最新バージョンのRails7にDeviseがまだ対応していないため、このままではいくつかエラーが発生してしまいます。

Rails7で開発を進めている方は、下記記事の「Undefined method ‘user_url’」エラーへの対処Controllerをカスタマイズの項目を参考に、設定の追加とコントローラーのカスタマイズを行っておいてください。

あわせて読みたい
【Rails7】Deviseを導入する方法(Turbo対応済み, メールサーバー設定込み) 【重要】Rails7でDeviseを導入される方へ2023年2月17日に最新版Devise(v4.9.0)がリリースされ、Rails7のTurboに対応するようになりました。それに伴い、当記事で紹介...

参考資料

あわせて読みたい
【Rails】「devise」で「管理者(admin)」と「会員(customer)」を分けて認証機能を構築!複数モデルを管... 今回は、アカウント管理を行える「devise」を使って、「管理者」と「会員」を作成する方法をまとめてみました。…
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

愛知の34歳。無職で暇になり始めたプログラミング(Ruby on Rails)の忘備録をまとめたブログです。最近は別にやりたいことができたのでプログラミングほぼやっていません。気が向いたらまた再開するかも。僕の日常はメインブログの方で更新しています。

コメント

コメントする

目次