プログラミング学習 備忘録

Railsを学習していく上での技術メモ。学んだことや解決したエラーなどを記録していきます。

Sorceryを使ってパスワードリセット機能を実装してみた②(エラー解決)

実装途中で、ルーティングが原因で引き起こされたエラーに見舞われました。 結果としてはケアレスミスが原因の、そこまで大した内容ではなかったのですが、今まで出会ったことのないタイプのエラーだったので備忘録として記録に残しておきます。

エラー解決

エラー内容:メールに記載されているeditアクションへのURLにアクセスしても、必ずログイン画面にリダイレクトされてしまう。

問題のコード

# password_resetsコントローラー内
  def edit
    @token = params[:id]
    @user = User.load_from_reset_password_token(params[:id])
    return not_authenticated if @user.blank?
  end

どうやらnot_authenticatedメソッドが起動しているらしい

not_authenticatedメソッドが発動しているということは、おそらく @token = params[:id]トークンを正しく取得できていない。

URLをよく確認してみる。
http://localhost:3000/password_resets/edit.px8FD-DRCKuq8J2XEY-c
なんか変だ・・・ 普通は/password_resets/:id/editとなっており、:idの部分にトークンが入るはず。ルーティングに問題ありと判断。

Rails.routesでルーティングを確認

    password_resets_new GET    /password_resets/new(.:format)                                                           password_resets#new
   password_resets_create GET    /password_resets/create(.:format)                                                        password_resets#create
     password_resets_edit GET    /password_resets/edit(.:format)                                                          password_resets#edit
   password_resets_update GET    /password_resets/update(.:format)                                                        password_resets#update
.
.
.
          password_resets POST   /password_resets(.:format)                                                               password_resets#create
       new_password_reset GET    /password_resets/new(.:format)                                                           password_resets#new
           password_reset PATCH  /password_resets/:id(.:format)                                                           password_resets#update
                          PUT    /password_resets/:id(.:format)                                                           password_resets#update
           board_comments GET    /boards/:board_id/comments(.:format)

なぜかルーティングが二重になっている?

ということでroutes.rbを確認。
resources :password_resets, only: %I[new create edut update]

editをedutとタイポしている!!また、SSは撮れなかったのですが、自動生成されているルーティングを消していなかったため二重にURLが生成されていた!

と、いうことで自動生成されている上の4行を削除し、タイポを直した。

        password_resets POST   /password_resets(.:format)                                                               password_resets#create
       new_password_reset GET    /password_resets/new(.:format)                                                           password_resets#new
      edit_password_reset GET    /password_resets/:id/edit(.:format)                                                      password_resets#edit
           password_reset PATCH  /password_resets/:id(.:format)                                                           password_resets#update
                          PUT    /password_resets/:id(.:format)                                                           password_resets#update


これで、editアクションへのURLが真ん中に:idを含んだ正しい形に修正された。 実際に動かしてみると、無事にparams[:id]を取得する事ができて正常に動作! URLを正しく定義することの大切さを改めて実感しました。