パスワードリセット機能の実装

パスワードをリセットするためにモジュールをインストール 

rails g sorcery:install reset_password --only-submodules

 

作成されるマイグレーションファイル

class SorceryResetPassword < ActiveRecord::Migration[5.2]
def change
add_column :users, :reset_password_token, :string, default: nil
add_column :users, :reset_password_token_expires_at, :datetime, default: nil
add_column :users, :reset_password_email_sent_at, :datetime, default: nil
add_column :users, :access_count_to_reset_password_page, :integer, default: 0

add_index :users, :reset_password_token
end
end

マイグレーションファイルを反映

rake db:migrate

 

メイラーの作成

rails g mailer UserMailer reset_password_email

app/mailers/user_mailer.rbを修正

class UserMailer < ApplicationMailer
def reset_password_email(user)
@user = User.find(user.id)
@url = edit_password_reset_url(@user.reset_password_token)
mail(to: user.email,
subject: 'パスワードリセット')
end
end

 

パスワードリセット用のメイラーを指定

user.reset_password_mailer = UserMailer

 

コントローラーの作成

rails g controller PasswordResets create edit update

class PasswordResetsController < ApplicationController
skip_before_action :require_login

def create
@user = User.find_by(email: params[:id])
@user&.deliver_reset_password_instructions!
redirect_to login_path
flash[:success] = "送信しました"
end

def edit
@token = params[:id]
@user = User.load_from_reset_password_token(@token)
not_authenticated if @user.blank?
end

def update
@token = params[:id]
@user = User.load_from_reset_password_token(@token)

return not_authenticated if @user.blank?

@user.password_confirmation = params[:user][:password_confirmation]
if @user.change_password(params[:user][:password])
redirect_to login_path
flash[:success] = '更新しました'
else
render :edit
flash.now[:danger] = '更新できませんでした'
end
end
end

 

ルーティングを追加

resources :password_resets, only: %i[create edit update]

 

メイラービューの設定

reset_password_email.html.erb

<h1><%= @user.nickname%>様</h1>

<p>==========================================</p>

<p>パスワード再発行のご依頼を受け付けました</p>

<p>こちらのリンクからパスワードの再発行を行ってください。</p>
<p><a href= "<%=@url %>"><%= @url %></a></p>

reset_password_email.text.erb

<%= @user.nickname%>様

パスワード再発行のご依頼を受け付けました。
 
こちらのリンクからパスワードの再発行を行ってください。
<%= @url %>

 

パスワードリセット用のフォームの作成

<%= form_with url: password_resets_path, local: true do |f|%>
<%= f.label :email%>
<%= f.email_field :email %>
<%= f.submit '送信'%>
<% end %>

 

<%= form_with model: @user, url: password_reset_path(@token), local: true do |f| %>
<%= f.label :email %><br>
<%= @user.email %>
 
<%= f.label :password %><br>
<%= f.password_field :password %>
 
<%= f.label :password_confirmation %><br>
<%= f.password_field :password_confirmation %>
 
<%= f.submit '更新' %>
<% end %>

 

letter_opener_webを追加する

gem 'letter_opener_web', '~> 1.0'

bundle installする

 

ルーティングを追加

mount LetterOpenerWeb::Engine, at: '/letter_opener' if Rails.env.development?

 

config/environments/development.rb


config.action_mailer.delivery_method = :letter_opener_web
config.action_mailer.default_url_options = Settings.default_url_options.to_h

 

環境ごとに異なる定数を管理できるgemをインストール

gem 'config'

bundle installする

 

設定ファイルの生成

rails g config:install

 

config/settings/development.yml

default_url_options:
host: 'localhost:3000'