複数のdeviseを作成して、別々のログイン画面を作る際のファイル作成からルーティング設定


オリジナルアプリケーション開発を行っています。
アプリケーション作成で勉強になった事をまとめていきます。

userとdoctorで複数のモデルを作成し、別々の新規登録画面、ログイン画面を作成します。通常は1つのログイン画面なのでルーティン設定など自動生成されますが、二つ作るとカスタマイズが必要で苦労した事をまとめていきます。

ruby '2.6.5'
rails '6.0.0'

まずdeviseをインストールします。

  gem 'devise'

インストールします。

  % bundle install

再起動してGemを反映させます。

  % rails s

deviseを使用するためには、Gemのインストールに加え、 devise専用のコマンドで設定ファイルを作成する必要があるので、設定関連に使用するファイル」を自動で生成するコマンドをします。

   % rails g devise:install

ここからがいつもと違うカスタマイズです。

1. config/initializers/devise.rbをいじる。

rails g devise:installで生成したファイルにconfig/initializers/devise.rbがあります。
そのファイルの

# config.scoped_views = false

これを

 config.scoped_views = true

にコメントアウトを外し、変更します。わかりにくいのですが大体247行目にあると思います。

2. それぞれのdeviseに関連するモデルを作ります。

   % rails g devise user
   % rails g devise doctor

それぞれ複数のファイルが生成されます。

3. それぞれのモデルに関連するコントローラーを作ります。

   % rails g devise:controllers users
   % rails g devise:controllers doctors

controllers(複数形)にして名前も(複数形)にします。

4. それぞれのdeviseに関連するビューを作ります。

   % rails g devise:views users
   % rails g devise:views doctors

これでMVCのdevise関連ファイルは作成出来ました。

ここまでは通常の1つのdeviseの作成とほぼ似てますね。

5. 次にルーティングの作成します。

   Rails.application.routes.draw do
  devise_for :doctors, controllers: {
    sessions: 'doctors/sessions',
    passwords: 'doctors/passwords',
    registrations: 'doctors/registrations'
  }
  devise_for :users, controllers: {
    sessions: 'users/sessions',
    passwords: 'users/passwords',
    registrations: 'users/registrations'  
  }

この様にそれぞれのルーティングがかぶらない様にします。

ルーティングを見ると、


          Prefix Verb   URI Pattern                                                                              Controller#Action
                   new_doctor_session GET    /doctors/sign_in(.:format)                                                               doctors/sessions#new
                       doctor_session POST   /doctors/sign_in(.:format)                                                               doctors/sessions#create
               destroy_doctor_session DELETE /doctors/sign_out(.:format)                                                              doctors/sessions#destroy
                  new_doctor_password GET    /doctors/password/new(.:format)                                                          doctors/passwords#new
                 edit_doctor_password GET    /doctors/password/edit(.:format)                                                         doctors/passwords#edit
                      doctor_password PATCH  /doctors/password(.:format)                                                              doctors/passwords#update
                                      PUT    /doctors/password(.:format)                                                              doctors/passwords#update
                                      POST   /doctors/password(.:format)                                                              doctors/passwords#create
           cancel_doctor_registration GET    /doctors/cancel(.:format)                                                                doctors/registrations#cancel
              new_doctor_registration GET    /doctors/sign_up(.:format)                                                               doctors/registrations#new
             edit_doctor_registration GET    /doctors/edit(.:format)                                                                  doctors/registrations#edit
                  doctor_registration PATCH  /doctors(.:format)                                                                       doctors/registrations#update
                                      PUT    /doctors(.:format)                                                                       doctors/registrations#update
                                      DELETE /doctors(.:format)                                                                       doctors/registrations#destroy
                                      POST   /doctors(.:format)                                                                       doctors/registrations#create
                     new_user_session GET    /users/sign_in(.:format)                                                                 users/sessions#new
                         user_session POST   /users/sign_in(.:format)                                                                 users/sessions#create
                 destroy_user_session DELETE /users/sign_out(.:format)                                                                users/sessions#destroy
                    new_user_password GET    /users/password/new(.:format)                                                            users/passwords#new
                   edit_user_password GET    /users/password/edit(.:format)                                                           users/passwords#edit
                        user_password PATCH  /users/password(.:format)                                                                users/passwords#update
                                      PUT    /users/password(.:format)                                                                users/passwords#update
                                      POST   /users/password(.:format)                                                                users/passwords#create
             cancel_user_registration GET    /users/cancel(.:format)                                                                  users/registrations#cancel
                new_user_registration GET    /users/sign_up(.:format)                                                                 users/registrations#new
               edit_user_registration GET    /users/edit(.:format)                                                                    users/registrations#edit
                    user_registration PATCH  /users(.:format)                                                                         users/registrations#update
                                      PUT    /users(.:format)                                                                         users/registrations#update
                                      DELETE /users(.:format)                                                                         users/registrations#destroy
                                      POST   /users(.:format)                                                                         users/registrations#create

となります。userとdoctorのルーティングが別々のものが出来ます。

form_withでuserは新規登録画面とログイン画面いけたのですが、doctorのルーティングがうまく出来なっかったので記事にしました。