解決したいこと
ユーザー情報更新後、任意のページに遷移するようにしたい。
方法として、after_update_path_forメソッドをオーバーライドする。
メソッドGithub
起こっている問題
app/controllers/application_controller.rbで、
after_update_path_forメソッドをオーバーライドしたが、
呼びだされず、「/」に遷移してしまう。
確認した方法は、メソッド内にbinding,pryを記述し、処理を実行。
結果として、処理は止まらず、ルートページに遷移。
ユーザー情報の更新は、問題なく行えていた。
class ApplicationController < ActionController::Base before_action :configure_permitted_parameters, if: :devise_controller? private def configure_permitted_parameters devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname]) devise_parameter_sanitizer.permit(:account_update, keys: [:nickname]) end def after_sign_in_path_for(resource) user_path(resource) end def after_update_path_for(resource) binding.pry # ここで処理が止まらなかった user_path(resource) end end
ルーティング
Rails.application.routes.draw do root to: 'xxx#index' devise_for :users resources :users, only: [:show] do resources :yyy, only: [:index] end end
調べたこと、考えたこと
上記binding.pryが機能しなかったことから、
オーバーライドしたメソッドが呼び出されず、
devise側のafter_update_path_forメソッドが呼び出されていると考えた。
まずは、メソッド名や利用方法を間違えたと考え調査。
こちらを見る限り、問題がないと判断。
また、下記の位置で処理をとめ、
コンソールで「after_update_path_for」を実行すると、
問題なく遷移させたいパスが返ってきた。
def configure_permitted_parameters devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname]) devise_parameter_sanitizer.permit(:account_update, keys: [:nickname]) binding.pry end
以上から、作成したメソッド自体に問題はないと判断。
次に、オーバーライドのメソッドが呼び出せないため、
after_actionで呼び出す方式を試す。
class ApplicationController < ActionController::Base before_action :configure_permitted_parameters, if: :devise_controller? #after_actionで呼び出す after_action :after_update_path_for, only: :update, if: :devise_controller? private def configure_permitted_parameters devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname]) devise_parameter_sanitizer.permit(:account_update, keys: [:nickname]) end def after_sign_in_path_for(resource) user_path(resource) end def after_update_path_for binding.pry #処理は止まり、呼び出せた redirect_to user_path(resource) end end
無事に呼び出せたが、ダブルレンダーのエラーが発生。
これは、binding.pryを抜けたあとに、
devise側のafter_update_path_forメソッドが、
呼び出されている事が原因だと判断。
つまり、元のafter_update_path_forメソッドが呼び出されるのを
どうにかしないと解決できないと考えた。
その後、調査していると下記を設定するという記事を5本ほど見かけた。
参考記事例:[Rails]deviseのカスタマイズ。ユーザー登録、編集後のリダイレクトページを変える方法と、編集時のパスワード入力をスキップする方法
# routes.rb devise_for :users, controllers: { registrations: 'users/registrations' }
しかし、ログイン後の遷移先をオーバーライドする after_sign_in_path_for(resource)メソッドは、
上記を設定していなくても、問題なく機能していることから、
こちらの対処法は合わないと考えた。
また、こちらは、deviseコントローラーではなく、
devise管理化においたusersコントローラーでupdateをする用の対策ではないかと考えた。
なぜafter_sign_in_path_forは、オーバーライドでき、
after_update_path_forのオーバーライドしたメソッドが機能しないのか、
ご教授いただきたく存じます。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。