9
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Render and/or redirect were called multiple times in this action...の罠[Rails]

Last updated at Posted at 2018-12-12

はじめに

Railsでの開発において、AbstractController::DoubleRenderErrorには何度か遭遇したことがあるため、今回も問題なく解決できると思っていましたが、思わぬ落とし穴にハマってしまったので、エラーの原因と解決方法を共有したいと思います。

Action_Controller__Exception_caught.png

問題のコード

application_controller.rb
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メソッドを使った時点でリダイレクト(遷移)は一回メソッド内で使われていることになります

よって、下記のようにコードを修正すればエラーは解決されます。

訂正コード

application_controller.rb
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]

9
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?