[Rails] devise使用時の新規登録、ログイン後のpathの指定方法
deviseのヘルパーメソッドの一つであるafter_sign_in_path_forでエラーが出て大ハマりしたので残しておきます。
振り返ってみれば単純なことだったのですが、知らないと私のようにハマってしまうこともあると思うので、どなたかの参考になれば幸いです。
前提
- devise導入済み
行いたいこと
- 新規登録、ログイン後の遷移先を指定したい
やることとしてはシンプルで、まず初めにapplication_controller.rb
を開き、ファイル内にafter_sign_in_path_for(resource)
を定義し、メソッドのオーバーライドをさせます。
メソッドのオーバーライドとは?
簡潔にいうと、継承元のクラスと継承先のクラスで同じメソッド名を指定することです。
そのようにすると、継承先のクラスで継承元のクラスのメソッドを呼び出せるようになります。
詳しくはこちらの記事が分かりやすいです。
class ApplicationController < ActionController::Base
def after_sign_in_path_for(resource)
redmembers_path
end
end
こちらはdeviseのヘルパーメソッドの一つで、ここに記述したpathへログイン時に遷移してくれるという便利メソッドの一つです。このメソッドがapplication_controller.rb
に定義されていない時はデフォルトのroot_path
に遷移してくれるようになっています。
厳密な仕組みはこちらの記事が参考になりました。after_sign_in_path_for(resource)
メソッドを使えば簡単にpathの指定ができます。
ハマったこと。
結論としましては、pathの指定時にredirect_to
をつけていたことが原因によるエラーでした。例:↓
class ApplicationController < ActionController::Base
def after_sign_in_path_for(resource)
redirect_to posts_path
end
end
どうやらこのメソッドはリダイレクト先を指定しなくてもpathの指定のみで動いてくれるようです。
つい癖でリダイレクト先を指定してしまったので、このようなエラー画面に出会いました。↓
ターミナル側:↓
AbstractController::DoubleRenderError
(Render and/or redirect were called multiple times in this action.
Please note that you may only call render OR redirect,
and at most once per action. Also note that neither redirect nor render terminate execution of the action,
so if you want to exit an action after redirecting,
you need to do something like "redirect_to(...) and return".):
見事にダブルレンダリングと言われていますね。
先ほども述べたようにpathの指定時にredirect_to
をつけていたことでこのメソッドの継承元のメソッドとレンダリングが被ってしまったことが原因だと思われました。
このあと、application_controller.rb
をいくら見返しても違和感すら感じず、同時に実装していたゲストログイン機能に原因があるのかと思っていました。。
これは完全にdeviseの知識不足によるエラーですね。
その時実装していたゲストログイン機能の記事:↓
最後に
deviseをはじめとするRailsのgemはとても便利で使いこなせれば高速で開発が叶いますが、仕組みを理解していないと今回のようにエラーが起きてしまうことも少なくありません。
今回で、まだまだdeviseの仕組みの理解が足りないことが分かりました。
少しでも私のようにハマってしまう方の助けとなれば幸いです。
なにか間違い(誤字脱字、技術面等)があればご指摘ください。
最後まで見てくださりありがとうございました。一緒に勉強がんばりましょう!
Discussion