【Rails】Devise+Letter_openerでメール認証機能の実装手順


目的

Deviseのconfirmableを使って、ユーザー新規登録時メール認証機能を実装します。

環境

Ruby 2.6.5
Rails 5.2.3
Devise 4.7.1
letter_opener_web 1.0

Devise + Letter opener 実装手順

Deviseをインストールする

Gemfile
gem 'devise', '~> 4.7', '>= 4.7.1'
terminal
$ bundle install

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

ターミナルのステップによる、以下4つのセッティングの確認が必要です。(クリックで展開)
1. メールの設定をする
config/environments/development.rb
config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }


2.rootの設定をする
config/routes.rb
Rails.application.routes.draw do
  root "home#index"
end


3. フラッシュメッセージの設定をする
app/views/layouts/application.html.erb
  <p class="notice"><%= notice %></p>
  <p class="alert"><%= alert %></p>


4. viewsファイルを生成する
terminal
$ rails g devise:views


以上のセッティングを完了したら、先ほど生成したdevise.rbでconfig.mailer_senderの内容を編集しましょう。

config/initializers/devise.rb
  # ==> Mailer Configuration
  # Configure the e-mail address which will be shown in Devise::Mailer,
  # note that it will be overwritten if you use your own mailer class
  # with default "from" parameter.
  config.mailer_sender = '[email protected]'

モデルを作成する

rails generate devise <MODEL>でモデルを作成します。

terminal
$ rails g devise User
      invoke  active_record
      create    db/migrate/20191027084057_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

そして、confirmableの機能を追加します。

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

マイグレーションファイルを編集する

マイグレイトする前にconfirmableのコメントアウトを外します。

db/migrate/xxxxxxxxxxx_devise_create_users.rb
class DeviseCreateUsers < ActiveRecord::Migration[5.2]
  def change
    create_table :users do |t|
      #略
      ## Confirmable
      t.string   :confirmation_token
      t.datetime :confirmed_at
      t.datetime :confirmation_sent_at
      t.string   :unconfirmed_email # Only if using reconfirmable
      #略
    end

    #略
    add_index :users, :confirmation_token,   unique: true
    #略
  end
end
terminal
$ rails db:migrate

念のために、schemaを確認しましょう。

db/schema.rb
ActiveRecord::Schema.define(version: 2019_10_27_084057) do

  create_table "users", force: :cascade do |t|
    #略
    t.string "confirmation_token"
    t.datetime "confirmed_at"
    t.datetime "confirmation_sent_at"
    t.string "unconfirmed_email"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true
    #略
  end
end

letter_opener_web をインストールする

Gemfile
group :development do
  gem 'letter_opener_web', '~> 1.0'
end
terminal
$ bundle install
config/routes.rb
Your::Application.routes.draw do
  mount LetterOpenerWeb::Engine, at: "/letter_opener" if Rails.env.development?
  #略
end
config/environments/development.rb
config.action_mailer.delivery_method = :letter_opener_web

これで、設定完了です。もう一度サーバーを起動して動作を確認します。

確認



確認オッケーです!

参考文献

https://github.com/plataformatec/devise
https://github.com/fgrehm/letter_opener_web