🗂

[Rails] devise使用時の新規登録、ログイン後のpathの指定方法

2023/07/18に公開

deviseのヘルパーメソッドの一つであるafter_sign_in_path_forでエラーが出て大ハマりしたので残しておきます。

振り返ってみれば単純なことだったのですが、知らないと私のようにハマってしまうこともあると思うので、どなたかの参考になれば幸いです。


前提

  • devise導入済み

行いたいこと

  • 新規登録、ログイン後の遷移先を指定したい

やることとしてはシンプルで、まず初めにapplication_controller.rbを開き、ファイル内にafter_sign_in_path_for(resource)を定義し、メソッドのオーバーライドをさせます。

メソッドのオーバーライドとは?

簡潔にいうと、継承元のクラスと継承先のクラスで同じメソッド名を指定することです。
そのようにすると、継承先のクラスで継承元のクラスのメソッドを呼び出せるようになります。

詳しくはこちらの記事が分かりやすいです。
https://techtechmedia.com/super-overwrite-ruby/

app/controllers/application_controller.rb
 class ApplicationController < ActionController::Base
  def after_sign_in_path_for(resource)
    redmembers_path
  end
 end

こちらはdeviseのヘルパーメソッドの一つで、ここに記述したpathへログイン時に遷移してくれるという便利メソッドの一つです。このメソッドがapplication_controller.rbに定義されていない時はデフォルトのroot_pathに遷移してくれるようになっています。

厳密な仕組みはこちらの記事が参考になりました。
https://qiita.com/gobtktk/items/9f13aa271b7876ba9935
このようにafter_sign_in_path_for(resource)メソッドを使えば簡単にpathの指定ができます。

ハマったこと。

結論としましては、pathの指定時にredirect_toをつけていたことが原因によるエラーでした。例:↓

app/controllers/application_controller.rb
 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の知識不足によるエラーですね。
その時実装していたゲストログイン機能の記事:↓
https://zenn.dev/yuna0960740/articles/6b7e898ecf614a

最後に

deviseをはじめとするRailsのgemはとても便利で使いこなせれば高速で開発が叶いますが、仕組みを理解していないと今回のようにエラーが起きてしまうことも少なくありません。
今回で、まだまだdeviseの仕組みの理解が足りないことが分かりました。

少しでも私のようにハマってしまう方の助けとなれば幸いです。
なにか間違い(誤字脱字、技術面等)があればご指摘ください。
最後まで見てくださりありがとうございました。一緒に勉強がんばりましょう!

Discussion