Deviseで複数のモデルのログイン機能を実装する時のお話

# Deviseで複数のモデルでログイン機能を作る場合の実装の仕方
今回は皆様おなじみdeviseで複数のモデルでのログイン機能の実装ということですが
わかりにくいので簡単に言うと
「ユーザー側のログイン機能」と「お店側のログイン機能」別々に作りたい、ということです。
今回作成するアプリ内で、お店側は商品を出品したりする機能。ユーザー側は商品を購入したりする機能と
やりたいことをわけたいため、ログインの段階から分けておきたい、ということです。
最初は全くわからなかったのですが意外にすんなりと実装できましたので困っている方はこちらをご覧ください

やることとしては
1, deviseのインストール
2, deviseのコマンドで複数のモデルを作成
3, それぞれのモデルに対応するdeviseのコントローラーを作成、編集
4, ルーティングを編集
5, それぞれのモデルのビューファイルを作成

細かいやることはのちに記述していきます。では一つずつ見ていきましょう

## Step1 まずは普通にdeviseをインストール
  正直ここに関しては今回割愛させていただきます
gemfileにdeviseを入れてbundle installしてどんどんインストールしていってください

## Step2 二種類のモデルを作成
さぁここからが本題です。
お店側とユーザー側、二つのログイン機能を作りたい、ということは
それぞれにモデルやテーブルが必要になる、ということですよね
というわけで

```
% rails g devise user
% rails g devise store
```
まずはこの二種類のモデルをrailsのdeviseコマンドで作っていきます
そしてマイグレーションファイルが二種類作られていると思いますので
お好みで編集してmigrateしておいてください

お店用とユーザー用のテーブルができていればOKです

## Step3 コントローラーの編集
ここからがほんの少しトリッキーかもしれないですね
deviseのコントローラーって基本見えないし触らないしって放置してましたが
今回からコントローラーも触っていきます

```
rails g devise:controllers users
rails g devise:controllers stores
```
この二つをターミナルに打ち込みます。
なぜコントローラーが複数形なのか、というと複数のコントローラーが作られるためです
（登録用のコントローラーとかログイン用のコントローラーなどなど）

そしてマイグレーションファイルでユーザーとお店に新しくカラムを追加しましたよね？
ということは個別にストロングパラメーターを設定しなければなりません

先ほど作ったusersのregistration_controllerを見てみましょう

```ruby:registrations_controller.rb
# frozen_string_literal: true

# class Users::RegistrationsController < Devise::RegistrationsController
  # before_action :configure_sign_up_params, only: [:create]
  # before_action :configure_account_update_params, only: [:update]

  # GET /resource/sign_up
  # def new
  #   super
  # end

  # POST /resource
  # def create
  #   super
  # end

  # GET /resource/edit
  # def edit
  #   super
  # end
(以下省略)
```
全てコメントアウトされていてなんのことやらという感じですが
私の推測ではデフォルトの記述ですよ！みたいなものだと思っています
こういう場合はコメントアウトを外すことでカスタマイズしていけるようです。
というわけでusersのregistrations_controller.rbにストロングパラメーターを追加していきます。

今回userにはnicknameというカラムを新たに設定したという体でいきましょう
ということはnicknameをストロングパラメーターで許可すれば良いのです。

まずは同ファイル内の41行目あたりにprotectedというものがあるかと思います
私はよく使うのはprivateメソッドですがこれをまずコメントアウト解除します

```ruby:registrations_controller.rb
  # protected

  # If you have extra params to permit, append them to the sanitizer.
  # def configure_sign_up_params
    # devise_parameter_sanitizer.permit(:sign_up, keys: [:attribute])
  #end
```
続いてその下に
configure_sign_up_paramsがありますね。登録用のストロングパラメーターです
これをコメントアウト解除し,許可したいパラメータを記述
以下のようなカタチになっていればOKです

```ruby:registrations_controller.rb
  protected

  # If you have extra params to permit, append them to the sanitizer.
  def configure_sign_up_params
    devise_parameter_sanitizer.permit(:sign_up, keys: [:attribute, :nickname])
  end
```
最後に
before_actionで使ってもらえるように
同ファイルのほぼ一番上のほうにbefore_actionに関する記述もあるので
コメントアウトしておきます。これでストロングパラメーターを使ってもらえるはずです

```ruby:registrations_controller.rb
# frozen_string_literal: true

#class Users::RegistrationsController < Devise::RegistrationsController
  before_action :configure_sign_up_params, only: [:create]
# before_action :configure_account_update_params, only: [:update]

```

あとはお店用のコントローラーでも同じことをすれば大丈夫です。

Step 4　ルーティングの設定
今のままではコントローラーを編集しただけなので使ってもらうことはできません
ルーティングでいま編集したコントローラー、アクションが呼び出されるように工夫しましょう

```ruby:routes.rb
Rails.application.routes.draw do
  devise_for :stores, controllers: {
    sessions: 'stores/sessions',
    passwords: 'stores/passwords',
    registrations: 'stores/registrations'
  }
  devise_for :users, controllers: {
    sessions: 'users/sessions',
    passwords: 'users/passwords',
    registrations: 'users/registrations'
  }

```

Step 5 ビューファイルの作成

```
% rails g devise:views user
% rails g devise:views store
```
個別のビューファイルを作ってアレンジを加えていけば大丈夫です

以上で実装できたかな、と思います。お疲れ様でした