Railsのdeviseでユーザー登録機能と法人登録機能をそれぞれ分けて実装する

プログラミングの学習を始めてはや1ヶ月半の人間です。

個人開発でBtoCのマッチングアプリを作ろうと思い、とりあえずまずはBとCの登録をしなければいけないことに気付き、初心者ながら色々調べつつポチポチと実装しましたので、アウトプットとして記事を残したいと思います。

ここではuserとcompanyでそれぞれの別個の管理テーブルをそれぞれ生成し実装します。

## 1.deviseの導入
まずはGemfileにdeviseを記し bundle install します。

そしてそのままターミナルでdeviseをインストールします。

```
% rails g devise:install
```

## 2. /config/initializers/devise.rb に手を加える
色々なコードがありますがその中の恐らく247行目?（自分は247行目でした）辺りのコメウントアウトされている、
config.scoped_views = false となっている記述を変更します。コメントアウトも下記のように外します。

```/config/initializers/devise.rb
  # ==> Scopes configuration
  # Turn scoped views on. Before rendering "sessions/new", it will first check for
  # "users/sessions/new". It's turned off by default because it's slower if you
  # are using only default views.
  config.scoped_views = true
```

## 3. devise関連のmodelを生成

今回はuserとcompanyのmodelを生成します。

```
% rails g devise user
% rails g devise company
```

## 4. 生成した各modelに関連するcontrollerを生成

```
% rails g devise:controllers users
% rails g devise:controllers companies
```

## 5. 関連するviewを生成

```
% rails g devise:views users
% rails g devise:views companies
```

## 6. routingの設定
これで無事にuserとcompanyの二つをdeviseによる管理ができるようになりました。
次にルーティングを追記します。

```/config/routes.rb
  devise_for :companies, controllers: {
    sessions:      'companies/sessions',
    passwords:     'companies/passwords',
    registrations: 'companies/registrations'
  }
  devise_for :users, controllers: {
    sessions:      'users/sessions',
    passwords:     'users/passwords',
    registrations: 'users/registrations'
  }
```
これでOKです。

## 7. 使わないviewの削除
これまでの手順の過程でもう使わないビューファイルが生成されてしまっているため削除します。

```
% rails d devise:views
```
以上で実装自体は完了しましたが、新規登録時のストロングパラメータ等の記述についてよくわからなかったため、自分流で調べ成功した例を元に説明します。

## 8. ストロングパラメータを設定する
今までdeviseのモデルが１つの時は追加したカラムがある場合、 application_controller.rb に以下のように設定していました。

```/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  private
  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
  end
end
```
しかし今回は二つのモデルがあるため、設定の仕方が分からず、appliction_controllerではなくdeviseで生成した各モデルに関連するそれぞれのcontrollerで設定することにしました。

基本的には**該当箇所のコメントアウトを外して許可するキーの配列に任意のカラムを追加**していくだけで良いかと思います。

```/controllers/users/registrations_controller.rb
class Users::RegistrationsController < Devise::RegistrationsController
  before_action :configure_sign_up_params, only: [:create]

  def configure_sign_up_params
    devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname, :email, :password, :phone_number, :detail])
  end
end
```

```/controllers/companies/registrations_controller.rb
class Companies::RegistrationsController < Devise::RegistrationsController
  before_action :configure_sign_up_params, only: [:create]

  def configure_sign_up_params
    devise_parameter_sanitizer.permit(:sign_up, keys: [:company_name, :email, :password, :phone_number, :office_url])
  end
end
```

以上で完了です。これであとはそれぞれのビューファイルで値を登録すれば無事にデータも保存され、ログイン、ログアウト等の機能も実装できるようになりました。

フォームのviewはuserとcompany二つ用意しなければならないことに注意してください。まあそこは部分テンプレートでどうにでもなりますね。

#### 最後に

読んでいただいた方、ありがとうございました。
Qiita初投稿のうえ、マークダウン記法等もまだ詳しく理解していないため、少し読みづらい点があったかもしれません。

指摘コメント等ありましたら、よろしくお願いいたします。
次回以降の改善に活用させていただきます。