はじめに
Railsでの開発において、AbstractController::DoubleRenderError
には何度か遭遇したことがあるため、今回も問題なく解決できると思っていましたが、思わぬ落とし穴にハマってしまったので、エラーの原因と解決方法を共有したいと思います。
問題のコード
class ApplicationController < ActionController::Base
.
.
def after_sign_in_path_for(resource)
if # ある条件を設定してますが、コードでは割愛
redirect_to hogehoge_path(resource) and return
end
user_path(resource)
end
.
.
end
エラー内容は、アクションの中で複数回render, redirect
メソッドを利用することはできませんと。またand return
でメソッドから抜けてください、と示されています。
しかし、その通りにand return
を記述してもエラーが消えることはありません。
僕はここでしばらくはまってしまいました。。。
ですがredirect_to .. and return
を記述しているafter_sign_in_path_for
は、ログイン後の遷移先ページを指定するメソッドであることを考えれば、after_sign_in_path_for
メソッドを使った時点でリダイレクト(遷移)は一回メソッド内で使われていることになります。
よって、下記のようにコードを修正すればエラーは解決されます。
訂正コード
class ApplicationController < ActionController::Base
.
.
def after_sign_in_path_for(resource)
if # ある条件を設定してますが、コードでは割愛
hogehoge_path(resource) and return
else
user_path(resource)
end
end
.
.
end
まとめ
通常Render and/or redirect were called multiple times in this action..
エラーに遭遇した時はand return
を追記して、メソッドから抜けるよう指定してあげれば問題ないのですが、今回のような場面であれば注意が必要です。
- 制御構文を埋め込むことによりある条件の元ではリダイレクトさせたい、、つまり、その時
redirect_to
を使わなければいけないと錯覚(誤認)する時
今回得た教訓は
after_sign_in_path_for
メソッド内では、redirect_to
は使えない。パスだけ記述する。
おわりに
同じエラーに遭遇し、この記事が役に立ったという方は、いいね、お願いします(^^)
Rails関連記事
正規表現まとめ(基礎)[Ruby編]
配列で利用できる主なメソッドをまとめてみた[Ruby編]
Mysql2::Error: Duplicate entry for key.. エラーを撃退した話(validationの設定)
Rails5でJqueryを利用しようとして少しハマった件(Uncaught ReferenceError: $ is not defined)
change_columnでの設定はrollbackできない話(This migration uses change_column, which is not automatically reversible.)[Rails: migration]
sessionに保存されたHashを別アクションで利用しようとした際にデータ型の変更によりハマった件[Rails]
Railsでfacebookログイン認証機能を実装してみた + エラーの原因はバリデーションだった
csvファイルを作成し、初期データを挿入しよう[Rails]
ArgumentError in ********Controller#send [Rails]