【Rails】deviseの導入手順

# はじめに
Railsでログイン等の認証機能を`devise`で実装する機会があったので手順をまとめておく。

# deviseとは
以下のような**認証機能**を簡単に実装することができるgem

* ユーザー登録
* ログイン
* ログアウト
* 登録情報の編集
* パスワード変更、再発行

# 導入手順
## 1. Gemfileに以下を追記する

```ruby:Gemfile
gem 'devise'
```

## 2. deviseの設定ファイルを作成する

```shell
$ rails g devise:install
```

コマンドを実行することで以下二つの設定ファイルが作成されます。

* config/initializers/devise.rb
* config/locales/devise.en.yml

## 3. モデルを作成する
* 認証機能を付与したいモデルを作成する
* `generation`の後は`model`ではなく`devise`とすることに注意する

```shell
$ rails g devise User
```

* 以下のようにmigrationファイルやモデルクラスファイルが作成されます。

```
      invoke  active_record
      create    db/migrate/20211206135237_devise_create_users.rb
      create    app/models/user.rb
      invoke    test_unit
      create      test/models/user_test.rb
      create      test/fixtures/users.yml
      insert    app/models/user.rb
       route  devise_for :users
```

### 3-1. Userモデルを確認してみる
デフォルトでは6つのモジュールが用意されており、パスワードの検証や、トークンの生成、ログイン回数のカウント等を行ってくれます。

```ruby:app/models/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
```
※ こちらの記事に詳しく書かれております。

https://qiita.com/cigalecigales/items/f4274088f20832252374#2-devise%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E6%A6%82%E8%A6%81

## 4. migrationファイルをDBに反映する

```shell
$ rails db:migrate
```

### 4-1. 新しく作成されたカラムを確認してみる
####  1. Docker上のMySQLコンテナに接続しログインする

```bash
$ docker-compose exec db bash
root@....:/# mysql -u user -p
```
####  2. コマンドでusersカラムを確認する

```bash
mysql>show databases; # データベースの確認
mysql>show tables from <データベース名>; # テーブルの確認
mysql>show columns from <テーブル名（今回はusers）> from <データベース名>; # カラムの確認
```

```bash
+------------------------+--------------+------+-----+---------+----------------+
| Field                  | Type         | Null | Key | Default | Extra          |
+------------------------+--------------+------+-----+---------+----------------+
| id                     | bigint       | NO   | PRI | NULL    | auto_increment |
| email                  | varchar(255) | NO   | UNI |         |                |
| encrypted_password     | varchar(255) | NO   |     |         |                |
| reset_password_token   | varchar(255) | YES  | UNI | NULL    |                |
| reset_password_sent_at | datetime     | YES  |     | NULL    |                |
| remember_created_at    | datetime     | YES  |     | NULL    |                |
| created_at             | datetime(6)  | NO   |     | NULL    |                |
| updated_at             | datetime(6)  | NO   |     | NULL    |                |
+------------------------+--------------+------+-----+---------+----------------+
8 rows in set (0.12 sec)
```

## 5. 新規登録画面を確認してみる

* http://localhost:3000/users/sign_up にアクセスし以下の画面になれば正しく動作しています。
![スクリーンショット 2021-12-09 0.32.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646903/59621c99-4e7a-eef9-1546-72e927280950.png)



## ビューを作成する

```
$ rails generate devise:views users
```
ログをみるとviewに関する色々なファイルが作成されていることがわかります。
カスタマイズする際は以下のファイルを編集します。

* 新規登録画面: `app/views/devise/registrations/new.html.erb`
* ログイン画面: `app/views/devise/sessions/new.html.erb`

以上が簡単な流れになります。


## ※ 編集したViewが反映されない場合
手順2 で作成された`config/initializers/devise.rb`の`config.scoped_views`のコメントアウトを外し`true`に変更してください。

```ruby:config/initializers/divise.rb
config.scoped_views = true
```

# 参考

https://qiita.com/yusuke1209kitamura/items/dcaf3622c21cf08ebdba

https://qiita.com/ichihara-development/items/9e9a8454178947eb519d

https://qiita.com/cigalecigales/items/f4274088f20832252374#2-devise%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E6%A6%82%E8%A6%81