はじめに
Railsチュートリアルを自分が理解しやすい表現に置き換える目的で利用しています。 手順を示す記事ではありません
hidden_fieldで値を保持しておく
パスワード再設定の送信メールにはeditとupdateアクションでメールアドレスとキーとしてユーザーを探す。これは両方のアクションでメールアドレスが必要になるから
だが、editアクションでメアドを取得し、フォームから一度送信してしまうと、この取得した情報(メアド等)が消えてしまい、updateアクションでエラーが出てしまう。
これを解決するには取得した値を保持すればよい。これを解決するのが
<% provide(:title, 'Reset password') %>
<h1>Reset password</h1>
<div class="row">
<div class="col-md-6 col-md-offset-3">
<%= form_for(@user, url: password_reset_path(params[:id])) 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>
の
hidden_field_tag :email, @user.email
この部分
このhedden_field_tagでは取得した値を保持するために隠しフィールドとしてページ内に保存される
これで他の情報と一緒にメールアドレスが送信されるようになる
ちなみに
今までは
f.hidden_field :email, @user.email
というコードを書いていたが今回は
hidden_field_tag :email, @user.email
と異なっている。これは前者ではメアドが**params[:user][:email]に保存されるが、後者ではparams[:email]**に保存されるという違いがある
errors_add
エラーメッセージを追加するコード
@user.errors.add(:password, :blank)
このコードは@userに対してパスワードが空だった場合にデフォルトでエラーメッセージを表示してくれるようになる
というのも、以前Userモデルでパスワードが空でもいい(allow_nil)を実装したため。今回はパスワードが空だとエラーになる。
password_reset_expired?
パスワード再設定メール送信に有効期限を付与したい場合、メールを送信してから2時間以上経過しパスワードが再設定されなかったら期限切れとする処理を行いたい
Rubyで表すと次のようになる
*reset_sent_at -> datetime
reset_sent_at < 2.hours.ago
これは**「~より少ない」と読んでしまうと困惑してしまうため、「~より早い」**と捉える
すると「パスワード再設定メールの送信時刻が2時間以上前(早い)」場合となる
def password_reset_expired?
reset_sent_at < 2.hours.ago
end
これにより、論理値を求めるメソッドが使えるようになる
テスト ~input~
assert_select "input[name=email][type=hidden][value=?]", user.email
これはinputタグに正しい名前、type="hidden"、メアドがあるかを確認する
Htmlで表示すると
<input id="email" name="email" type="hidden" value="michael@example.com" />
を対象としてテストしている