0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Railsチュートリアル 12 PasswordResets メモ

Last updated at Posted at 2019-04-08

はじめに

Railsチュートリアルを自分が理解しやすい表現に置き換える目的で利用しています。 手順を示す記事ではありません

hidden_fieldで値を保持しておく

パスワード再設定の送信メールにはeditとupdateアクションでメールアドレスとキーとしてユーザーを探す。これは両方のアクションでメールアドレスが必要になるから
だが、editアクションでメアドを取得し、フォームから一度送信してしまうと、この取得した情報(メアド等)が消えてしまい、updateアクションでエラーが出てしまう。
これを解決するには取得した値を保持すればよい。これを解決するのが

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_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時間以上前(早い)」場合となる

user.rb
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" />

を対象としてテストしている

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?