Rails勉強ネタ deviseでメール認証

![rails.png](https://qiita-image-store.s3.amazonaws.com/0/251648/b5d7f778-e8a8-c24f-0453-ff26d7c886a0.png)


# 目標
[devise](https://github.com/plataformatec/devise)で**メール認証**（アカウントを新規作成後、登録したメールアドレス宛に送られた確認リンクを踏むまでログインできないという動作）を実装する。
deviseの**confirmable** というモジュールがその機能を持っている。

# devise用意
①まずはGemfileにdeviseを入れて`bundle install`します。

```Gemfile.
gem 'devise'
```

```
bundle install
```
↓ 

②`rails g devise:install`します。

```
$ rails g devise:install
      create  config/initializers/devise.rb
      create  config/locales/devise.en.yml
===============================================================================

```

↓
③`rails g devise User`します。 deviseで認証するためのモデルの作成です。

```
$ rails g devise User
      invoke  active_record
      create    db/migrate/20190328153745_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
```
↓
**※注意！**
migrationファイルの**confirmableのコメントアウトを外します**。

```20190328153745_devise_create_users.rb
class DeviseCreateUsers < ActiveRecord::Migration[5.1]
  def change
    create_table :users do |t|
      ## Database authenticatable
      t.string :email,              null: false, default: ""
      t.string :encrypted_password, null: false, default: ""

      ## Recoverable
      t.string   :reset_password_token
      t.datetime :reset_password_sent_at

      ## Rememberable
      t.datetime :remember_created_at

      ## Trackable
      # t.integer  :sign_in_count, default: 0, null: false
      # t.datetime :current_sign_in_at
      # t.datetime :last_sign_in_at
      # t.string   :current_sign_in_ip
      # t.string   :last_sign_in_ip

      ## Confirmable
      t.string   :confirmation_token
      t.datetime :confirmed_at
      t.datetime :confirmation_sent_at
      t.string   :unconfirmed_email # Only if using reconfirmable

      ## Lockable
      # t.integer  :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts
      # t.string   :unlock_token # Only if unlock strategy is :email or :both
      # t.datetime :locked_at


      t.timestamps null: false
    end
```

↓

④`rails db:migrate` でmigrationファイルを読み込みます。

```
$ rails db:migrate
== 20190328153745 DeviseCreateUsers: migrating ================================
-- create_table(:users)
   -> 0.0035s
-- add_index(:users, :email, {:unique=>true})
   -> 0.0014s
-- add_index(:users, :reset_password_token, {:unique=>true})
   -> 0.0012s
== 20190328153745 DeviseCreateUsers: migrated (0.0065s) =======================
```

↓
⑤DeviseControllerをカスタマイズしたい場合は
`rails g devise:controllers users`します。

```
$ rails g devise:controllers users
```
↓
⑥DeviseViewをカスタマイズしたい場合は
`rails g devise:views users`します。

```
$ rails g devise:views users
```


##confirmableモジュールを追加

①`devise`に `:confirmable`を追加します。
↓

```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, :confirmable
end
```


↓
②メールの設定
`config/environments/development.rb`で以下を追加。


```developmetn.rb
config.action_mailer.default_url_options = { host: 'localhost:3000' }
```

**これだけでメール認証が実装されました。**

#確認
`http://localhost:3000/users/sign_up`からサインアップすると、
コンソールでメールの送信ログが確認できます。

![スクリーンショット 2019-03-29 1.12.58.png](https://qiita-image-store.s3.amazonaws.com/0/251648/31600b62-348f-dc2d-46d0-9324653408df.png)
![スクリーンショット 2019-03-29 1.22.48.png](https://qiita-image-store.s3.amazonaws.com/0/251648/0b1d6362-0592-2b9f-7b43-14e8aa9e80a0.png)

**letter_opener** などのgemを使うと確認がわかりやすいかもしれません。