読者です 読者をやめる 読者になる 読者になる

ぞえの技術めも

Ruby on Rails勉強中

【133日目】【1日20分のRailsチュートリアル】【第10章】パスワード再設定画面でメールアドレスを送信したときの処理

Ruby on Railsチュートリアル(第3版)

今日は「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)を入れて送信してみる。

f:id:kt_zoe:20170413122631p:plain

エラーのfalshメッセージ表示されました。

正しいメールアドレス送信が正常に動作するにはメイラーメソッドの定義が必要らしい。まだか。

今日の学習時間は【26分】

次は「10.2.3 PasswordResetsメイラーメソッド」から。