【Rails】「devise」で「管理者(admin)」と「会員(customer)」権限を分けて認証機能を構築!複数モデルを管理する方法!(初心者向け!設定手順まとめ!)

今回は、アカウント管理を行える「devise」を使って、「管理者」と「会員」を作成する方法をまとめてみました。
分かりやすくするため、「管理者(admin)」「会員(customer)」という名前で作成してみます。

目次

「devise」のインストール

まず、「devise」を「Gemfile」に追加して、インストールします。

gem 'devise'
bundle install

インストールコマンドとconfigファイルの修正

以下のコマンドを実行します。

$ rails g devise:install

「/config/initializers/devise.rb」の中を見ると、
コメント行になっている「#config.scoped_views = false」という部分があるので、コメントを外して「true」に変更します。

# config.scoped_views = false
# 元々の状態
config.scoped_views = true
# これでオッケー!

変更できれば次に進みます。

「adminモデル」と「customerモデル」を作成

モデルを作成します。

$ rails g devise admin
$ rails g devise customer

※作成したら、必ずすぐに「マイグレーション」をしましょう!
マイグレーションを忘れると、一通りの作業が終わった後に正常に動作しないことがあります。
私はこれで一度ハマりました…。笑

rails db:migrate

これでOKですね。
万が一、ミスったときの対処法はこちらをみてください!

「adminsコントローラ」と「customersコントローラ」を作成

続いて、コントローラも作成します。
コマンドは以下の通り。

$ rails g devise:controllers admins
$ rails g devise:controllers customers

「View」の作成

deviseのビューを作成します。
コマンドは以下の通りです。

$ rails g devise:views admins
$ rails g devise:views customers

「Routing」の作成

ルーティングを書いていきます。
現状のルーティングを確認すると以下のようになっています。

devise_for :users
devise_for :admins

一見、問題なさそうですが、「rails routes」してみると、、、

                   Prefix Verb   URI Pattern                       Controller#Action
                                :
cancel_admin_registration GET    /admins/cancel(.:format)          devise/registrations#cancel
       admin_registration POST   /admins(.:format)                 devise/registrations#create
   new_admin_registration GET    /admins/sign_up(.:format)         devise/registrations#new
  edit_admin_registration GET    /admins/edit(.:format)            devise/registrations#edit
                                :
                                :
 cancel_user_registration GET    /customers/cancel(.:format)       devise/registrations#cancel
        user_registration POST   /customers(.:format)              devise/registrations#create
    new_user_registration GET    /customers/sign_up(.:format)      devise/registrations#new
   edit_user_registration GET    /customers/edit(.:format)         devise/registrations#edit
                                :
                                :

一番右の「Controller#Action」の項目が丸かぶりなのが分かります。
これではまずいので、「routes.rb」を書き換えて…

devise_for :admins, controllers: {
  sessions:      'admins/sessions',
  passwords:     'admins/passwords',
  registrations: 'admins/registrations'
}
devise_for :customers, controllers: {
  sessions:      'customers/sessions',
  passwords:     'customers/passwords',
  registrations: 'customers/registrations'
}

これでOKですね。
もう一度、「rails routes」してみると…。

                   Prefix Verb   URI Pattern                       Controller#Action
                                :
cancel_admin_registration GET    /admins/cancel(.:format)          admins/registrations#cancel
       admin_registration POST   /admins(.:format)                 admins/registrations#create
   new_admin_registration GET    /admins/sign_up(.:format)         admins/registrations#new
  edit_admin_registration GET    /admins/edit(.:format)            admins/registrations#edit
                                :
                                :
 cancel_user_registration GET    /customers/cancel(.:format)       customers/registrations#cancel
        user_registration POST   /customers(.:format)              customers/registrations#create
    new_user_registration GET    /customers/sign_up(.:format)      customers/registrations#new
   edit_user_registration GET    /customers/edit(.:format)         customers/registrations#edit
                                :
                                :

ちゃんとadminsとcustomersに分けることができました!

最後の処理

先にできてしまっていた、デフォルトのビューを削除します。
(新規に作った方は作業不要?だと思いますが、念のため!)

$ rails d devise:views

これで完了です!

全ての作業を完了することができました!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次