Railsチュートリアル:12章(わからないとこメモです)


もはや最後までいったんいくことのみが目標になってしまった

第12章パスワードの再設定

やることまとめ。

  • ユーザーがパスワードの再設定をリクエストすると、ユーザーが送信したメールアドレスをキーにしてデータベースからユーザーを見つける
  • 該当のメールアドレスがデータベースにある場合は、再設定用トークンとそれに対応するリセットダイジェストを生成する
  • 再設定用ダイジェストはデータベースに保存しておき、再設定用トークンはメールアドレスと一緒に、ユーザーに送信する有効化用メールのリンクに仕込んでおく
  • ユーザーがメールのリンクをクリックしたら、メールアドレスをキーとしてユーザーを探し、データベース内に保存しておいた再設定用ダイジェストと比較する (トークンを認証する)
  • 認証に成功したら、パスワード変更用のフォームをユーザーに表示する

12.1 PasswordResetsリソース

ブランチを作成後、

rails generate controller PasswordResets new edit --no-test-framework

実行しようとすると

FATAL: Listen error: unable to monitor directories for changes.
Visit https://github.com/guard/listen/wiki/Increasing-the-amount-of-inotify-watchers for info on how to fix this.

調べてみるとよい解決策を公開されている方が。

rails consoleが起動できない時の対処法(「FATAL: Listen error」エラー編)

言われたとおりにやるとすぐ解決しました。

12.1.2 新しいパスワードの設定

12.1.3 createアクションでパスワード再設定

ここは意外と理解できる
コードとしてというよりは構造として。

12.2 パスワード再設定のメール送信

12.2.1 パスワード再設定のメールとテンプレート

12.2.2 送信メールのテスト

この辺は前章の復習に近い。全勝が理解できてれば問題ないとおもう。

12.3 パスワードを再設定する

12.3.1 editアクションで再設定

このリンクを機能させるためには、パスワード再設定フォームを表示するビューが必要です。このビューはユーザーの編集フォーム (リスト 10.2) と似ていますが、今回はパスワード入力フィールドと確認用フィールドだけで十分です。

ただし、今回の作業は少しだけ面倒な点があります。というのも、メールアドレスをキーとしてユーザーを検索するためには、editアクションとupdateアクションの両方でメールアドレスが必要になるからです。例のメールアドレス入りリンクのおかげで、editアクションでメールアドレスを取り出すことは問題ありません。しかしフォームを一度送信してしまうと、この情報は消えてしまいます。この値はどこに保持しておくのがよいのでしょうか。今回はこのメールアドレスを保持するため、隠しフィールドとしてページ内に保存する手法をとります。これにより、フォームから送信したときに、他の情報と一緒にメールアドレスが送信されるようになります。実際のコード (リスト 12.14) を見てみましょう。

↑これはわかりやすい説明。概念的には。

12.3.2 パスワードを更新する

updateアクションでは、次の4つのケースを考慮する必要があります。

  • パスワード再設定の有効期限が切れていないか
  • 無効なパスワードであれば失敗させる (失敗した理由も表示する)
  • 新しいパスワードが空文字列になっていないか (ユーザー情報の編集ではOKだった)
  • 新しいパスワードが正しければ、更新する

12.3.3 パスワードの再設定をテストする

12.4 本番環境でのメール送信 (再掲)

とくにコメントなくおわってしまった。