##パスワードを再設定する
次はPasswordResetsコントローラのeditアクションの実装を進めていきましょう。
統合テストを使ってうまく動作しているかのテストも行っていきます。
###editアクションで再設定
今回はこのメールアドレスを保持するため、隠しフィールドとしてページ内に保存する手法を使い作成
####パスワード再設定のフォーム
app/views/password_resets/edit.html.erb
<% provide(:title, 'Reset password') %>
<h1>Reset password</h1>
<div class="row">
<div class="col-md-6 col-md-offset-3">
<%= form_with(model: @user, url: password_reset_path(params[:id]),
local: true) do |f| %>
<%= render 'shared/error_messages' %>
<%= hidden_field_tag :email, @user.email %>
<!--隠しフィールドとしてページ内に保存する手法をとります。-->
<!--フォームを送信した後使用するメアドが消えてしまうので
ここに保存させる。-->
<%= f.label :password %>
<%= f.password_field :password, class: 'form-control' %>
<%= f.label :password_confirmation, "Confirmation" %>
<%= f.password_field :password_confirmation, class: 'form-control' %>
<%= f.submit "Update password", class: "btn btn-primary" %>
<% end %>
</div>
</div>
####パスワード再設定のeditアクション
app/controllers/password_resets_controller.rb
class PasswordResetsController < ApplicationController
before_action :get_user, only: [:edit, :update]
before_action :valid_user, only: [:edit, :update]
# その前に行う
def new
end
def create
@user = User.find_by(email: params[:password_reset][:email].downcase)
# メールアドレスをキーとしてユーザーをデータベースから見つける
if @user
@user.create_reset_digest
# パスワード再設定用トークンと
# 送信時のタイムスタンプでデータベースの属性を更新
@user.send_password_reset_email
flash[:info] = "Email sent with password reset instructions"
redirect_to root_url
else
flash.now[:danger] = "Email address not found"
render 'new'
end
end
def edit
end
private
def get_user
@user = User.find_by(email: params[:email])
# 見つける
end
# 正しいユーザーかどうか確認する
def valid_user
unless (@user && @user.activated? &&
@user.authenticated?(:reset, params[:id]))
# 存在する、有効化、認証済み、出なければ
redirect_to root_url
# ホーム画面に移動
end
end
end
###演習
1.
12.2.1.1で示した手順に従って、Railsサーバーのログから送信メールを探し出し、そこに記されているリンクを見つけてください。そのリンクをブラウザから表示してみて、図 12.11のように表示されるか確かめてみましょう。
確認
先ほど表示したページから、実際に新しいパスワードを送信してみましょう。どのような結果になるでしょうか?
しなかった。