パスワードリセット機能の実装
パスワードをリセットするためにモジュールをインストール
rails g sorcery:install reset_password --only-submodules
作成されるマイグレーションファイル
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: