Railsのdeviseで２種類のユーザーを作成する方法

rails初学者です。
オリジナルアプリ開発にて、deviseを使って２種類のユーザーを作成したかったのですが、方法がわからず他の記事を見ながら調べてきたのでまとめてみました。

## この記事の目指すところ
食べログのようなアプリで、
お店を利用する側のユーザー **customer_user**モデルと
お店を投稿する側のユーザー **owner_user**モデルの
２種類のモデルを作成する。
またそれぞれにnameカラムを持たせ、ストロングパラメータを設定する。

## 環境
ruby '2.6.5'
rails '6.0.0'
devise '4.7.3'

※deviseがrailsアプリにインストールされている前提

## 各モデルの生成
それぞれのモデルを生成していきます。
deviseでuserモデルを生成する方法と全く同じように、ターミナル（コマンドライン）でコマンドを実行していきます。

まずcustomer_userモデルを生成します。

```terminal
$ rails g devise customer_user
```

次にowner_userモデルを生成します。

```terminal
$ rails g devise owner_user
```

これでcustomer_userモデルとowner_userモデルが生成されました。
またそれぞれのマイグレーションファイルも生成されたので、マイグレーションファイルにnameカラムを追加します。（通常のやり方と同様です）


```ruby:db/migrate/2021xxxxxxxx_devise_create_cutomer_users.rb
class DeviseCreateCustomerUsers < ActiveRecord::Migration[6.0]
  def change
    create_table :customer_users do |t|
      ## Database authenticatable     
      t.string :name,               null: false  #string型のnameカラムを追加
      t.string :email,              null: false, default: ""
      t.string :encrypted_password, null: false, default: ""
```

ownerモデルを生成時のマイグレーションファイルについても同様に記述します。

## 各コントローラーの作成
１つのユーザーモデルをdeviseで生成する場合は、特にコントローラーをカスタマイズしない限り、コントローラーを手動で生成する必要はありませんが
複数モデルの場合はそれぞれについてコントローラを生成します。

```terminal
$ rails g devise:controllers customer_users
```

```terminal
$ rails g devise:controllers owner_users
```
このとき、controller's'となることに注意です。


## 各ビューファイルの作成
ビューファイルについてもターミナルで生成していきます。

```terminal
$ rails g devise:views customer_users
```
```terminal
$ rails g devise:views owner_users
```

## ルーティングの設定

ルーティングの設定を、生成したコントローラーを参照するよう設定します。

```ruby:config/routes.rb
Rails.application.routes.draw do
  devise_for :customer_users, controllers: {
    sessions: 'customer_users/sessions',
    registrations: 'customer_users/registrations'
  }

  devise_for :owner_users, controllers: {
    sessions: 'owner_users/sessions',
    registrations: 'owner_users/registrations'
  }
end
```

## ストロングパラメーターの設定
１つのユーザーモデルを生成した際にストロングパラメーターを設定する時は
app/controllers/application_controller.rbに

```ruby
devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
```
を記述していましたが、今回は生成したcustomer_usesとowner_usersのregstrationコントローラーにそれぞれストロングパラメーターを記述していきます。

上記のコントローラーには、すでにコメントアウトされた状態でストロングパラメーターの記述があります。
ファイルの中に下記のような記述があるので、これを有効化し、nameカラムを追加します。

```ruby:app/controllers/customer_users/registration_controller
# def configure_sign_up_params
  # devise_parameter_sanitizer.permit(:sign_up, keys: [:attribute])
# end
```
有効化してnameカラムを追加↓

```ruby:app/controllers/customer_users/registration_controller
def configure_sign_up_params
  devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
end
```
またこれを呼び出すbefore_actionの記述もコメントアウトされた状態で記述されているのでこちらも有効化します

```ruby:app/controllers/customer_users/registration_controller
# before_action :configure_sign_up_params, only: [:create]
```
有効化↓

```ruby:app/controllers/customer_users/registration_controller
before_action :configure_sign_up_params, only: [:create]
```

これでストロングパラメーターの設定ができました。

## 補足
deviseのメソッドを使う場合は、命名したモデル名を使用することに注意してください。
例
current_user ⇨ current_customer_user
user_signed_in? ⇨ customer_user_signed_in? 

## 最後に
deviseは自動でユーザー管理機能を実装してくれる便利なライブラリですが
裏側を知らないと自分でカスタマイズできない厄介者ですね。

以上です。