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を正しく定義することの大切さを改めて実感しました。