【133日目】【1日20分のRailsチュートリアル】【第10章】パスワード再設定画面でメールアドレスを送信したときの処理
今日は「10.2.2 PasswordResetsコントローラとフォーム」のフォームからメールアドレスを送信するところから。
10.2.2 PasswordResetsコントローラとフォーム
図10.12のフォームから送信を行なった後、メールアドレスをキーとしてユーザーをデータベースから見つけ、パスワード再設定用トークンと送信時のタイムスタンプでデータベースの属性を更新する必要があります。
(中略) 送信が無効の場合は、ログイン (リスト8.9) と同様にnewページを出力してflash.nowメッセージを表示します。
パスワード再設定フォームからメールアドレスが送信された後の処理をcreateアクションとして追加する。
app/controllers/password_resets_controller.rb
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
Userモデル内のコードは、before_createコールバック (リスト10.3) 内で使用されるcreate_activation_digestメソッドと似ています(リスト10.42)。
上で追加したcreate_reset_digest
メソッドとかあったっけ、と思ってたらここで追加するのか。
アカウント有効化の処理と似てますね。
app/models/user.rb
attr_accessor :remember_token, :activation_token, :reset_token : # パスワード再設定の属性を設定する def create_reset_digest self.reset_token = User.new_token update_attribute(:reset_digest, User.digest(reset_token)) update_attribute(:reset_sent_at, Time.zone.now) end # パスワード再設定のメールを送信する def send_password_reset_email UserMailer.password_reset(self).deliver_now end :
図10.13に示すように、この時点でのアプリケーションは、無効なメールアドレスを入力した場合に正常に動作します。
サーバーを起動して
$ rails server -b $IP -p $PORT
パスワード再設定画面で適当なメールアドレス(test01@example.com)を入れて送信してみる。
エラーのfalshメッセージ表示されました。
正しいメールアドレス送信が正常に動作するにはメイラーメソッドの定義が必要らしい。まだか。
今日の学習時間は【26分】。
次は「10.2.3 PasswordResetsメイラーメソッド」から。