【Rails6】deviseで独自カラムを追加して使用する方法 ③

## これまで
これまでに、deviseのインストール・Userモデルの作成・Viewの作成を行いました。

今回は、コントローラ・ルーティング・モデルのカスタマイズを行っていきたいと思います。

▽前回の記事はこちら▽
[【Rails6】deviseで独自カラムを追加して使用する方法 ①](https://qiita.com/kamataku/items/e54150357cd51e1b3a40)

[【Rails6】deviseで独自カラムを追加して使用する方法 ②](https://qiita.com/kamataku/items/4fdf5dafe3693e8e452d)

## ① Controller 作成
View を追加する`rails g devise:controllers users` コマンドを実行

```sh
$ rails g devise:controllers users
Running via Spring preloader in process 5360
      create  app/controllers/users/confirmations_controller.rb #認証メール再送用
      create  app/controllers/users/passwords_controller.rb #パスワード変更関連用
      create  app/controllers/users/registrations_controller.rb #ユーザ登録関連用
      create  app/controllers/users/sessions_controller.rb #ログイン用
      create  app/controllers/users/unlocks_controller.rb #ロック解除メール再送用
      create  app/controllers/users/omniauth_callbacks_controller.rb #外部ログイン用
===============================================================================

Some setup you must do manually if you haven't yet:

  Ensure you have overridden routes for generated controllers in your routes.rb.
  For example:

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

===============================================================================
```

上記コマンドで、ひと通り devise 用の Controller ( 各ファイルに `#` でファイルの用途を記載しました ) が生成されます。

上記のコマンド結果に記載の通り、カスタマイズしたコントローラを反映させるためには、ルーティング設定をしないといけません。

## ② routes.rb 編集
`/config/routes.rb` ファイルを編集していきます。

```ruby:routes.rb_編集前
Rails.application.routes.draw do
  devise_for :users
  # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
end
```

```ruby:routes.rb_編集後
Rails.application.routes.draw do

  devise_for :users, controllers: {
    confirmations: 'users/confirmations',
    passwords: 'users/passwords',
    registrations: 'users/registrations',
    sessions: 'users/sessions',
    unlocks: 'users/unlocks'
  }

  # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
end
```
上記のように、カスタマイズするコントローラを記載していきます。

## ③ コントローラのカスタマイズ
今回は、独自カラムを追加していますが、特段コントローラーを変更する必要はありませんが、
今回Devise用の [レイアウトテンプレート](https://qiita.com/kamataku/items/4fdf5dafe3693e8e452d#-view-%E3%81%AE%E6%A7%8B%E6%88%90) を使いページを表示させるため、コントローラへレイアウトテンプレートを読み込ませる文を追記します。
また、 [レイアウトテンプレート](https://qiita.com/kamataku/items/4fdf5dafe3693e8e452d#-%E3%83%AC%E3%82%A4%E3%82%A2%E3%82%A6%E3%83%88%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88-%E4%BD%9C%E6%88%90)のページタイトルを `<title><%= @page_title%> | Sample</title`   としてインスタンス変数を入れページ毎のページタイトルに対応させているので、コントローラ へ ページタイトルも追記します。

同じ作業になるので、例で `/users/confirmations_controller.rb` に追記します。

```ruby:confirmations_controller.rb_編集前
# frozen_string_literal: true

class Users::ConfirmationsController < Devise::ConfirmationsController
  # GET /resource/confirmation/new
  # def new
  #   super
  # end

  # POST /resource/confirmation
  # def create
  #   super
  # end

  # GET /resource/confirmation?confirmation_token=abcdef
  # def show
  #   super
  # end

  # protected

  # The path used after resending confirmation instructions.
  # def after_resending_confirmation_instructions_path_for(resource_name)
  #   super(resource_name)
  # end

  # The path used after confirmation.
  # def after_confirmation_path_for(resource_name, resource)
  #   super(resource_name, resource)
  # end
end
```

```ruby:confirmations_controller.rb_編集後
# frozen_string_literal: true

class Users::ConfirmationsController < Devise::ConfirmationsController

  layout "devise"

  # GET /resource/confirmation/new
  def new
    @page_title = "確認メールが届かない場合"
    super
  end

  # POST /resource/confirmation
  # def create
  #   super
  # end

  # GET /resource/confirmation?confirmation_token=abcdef
  # def show
  #   super
  # end

  # protected

  # The path used after resending confirmation instructions.
  # def after_resending_confirmation_instructions_path_for(resource_name)
  #   super(resource_name)
  # end

  # The path used after confirmation.
  # def after_confirmation_path_for(resource_name, resource)
  #   super(resource_name, resource)
  # end
end
```

`layout "login"`とコントローラ内に記載すると、Rails側で `devise.html.erb`をレイアウトテンプレートとして認識します。

## ④ モデルのカスタマイズ
モデルへは、Deviseで使用する機能を追記します。

```ruby:user.rb_編集前
class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
end
```

```ruby:user.rb_編集後
class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable,
         :trackable, :confirmable, :lockable, :timeoutable
end
```

| No | 機能 | 説明 |
| :-: |:-|:-|
| 1  | database_authenticatable | デフォルト |
| 2  | registerable             | デフォルト |
| 3  | recoverable              | デフォルト |
| 4  | rememberable             | デフォルト |
| 5  | validatable              | デフォルト |
| 6  | trackable                | ログイン回数・ログイン日時・IPアドレスの記録 |
| 7  | confirmable              | 認証メールの送信・メール認証の確認 |
| 8  | lockable                 | ログインの連続失敗によるロック・ロック解除メール送信　|
| 9  | timeoutable              | 一定期間動作のないアカウントのログアウト |
| 10 | omniauthable             | 外部サービスの認証 (Twitter・Facebookなど) |

上記の機能の説明を表にしてみました。

ここまで行うと、使用する機能・コントローラ・レイアウトテンプレートが反映されます。

長くなりましたので、記事を分けてご紹介しようと思います。
次回は、デバイスの設定 ( 独自カラムでログインできるようにする ) 行っていきたいと思います。

▽次の記事はこちら▽
[【Rails6】deviseで独自カラムを追加して使用する方法 ④](https://qiita.com/kamataku/items/c8a15875517dd56a37e8)