4
0

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 1 year has passed since last update.

【RailsAPI】AbstractController::DoubleRenderErrorの対処法

Last updated at Posted at 2021-12-28

症状

RailsAPIモードで、条件でrenderするものを変えるアクションを作成時に、以下のエラーが発生しました。 翻訳すると、「このアクションでは、レンダリングおよび/またはリダイレクトが複数回呼び出されました。ご注意ください」
error
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".):

//全文翻訳
AbstractController :: DoubleRenderError(このアクションでは、レンダリングまたはリダイレクト、あるいはその両方が複数回呼び出されました。
レンダリングまたはリダイレクトのみを呼び出すことができ、アクションごとに最大1回呼び出すことができます。
また、リダイレクトもレンダリングも実行を終了しないことに注意してください
したがって、リダイレクト後にアクションを終了する場合は、「redirect_to(...)andreturn」のような操作を行う必要があります。):

以下が該当のコードです。(すごい簡略化しました)

HogeController.rb
def update_hoge
  user = User.find_by(id: params[:user_id])

  if(user.update!(
    hoge: params[:hoge],
  ))
     render json: {user: user}, status: :ok
  else
    render json: {}, status: :unauthorized
  end

  render json: {user:user}, status: :ok
end

解決策

if分の後にもrenderがあったため、2重でrenderにかエラーが発生していたようです。 最後のrenderを消すことで解決しました。
HogeController.rb
def update_hoge
  user = User.find_by(id: params[:user_id])

  if(user.update!(
    hoge: params[:hoge],
  ))
     render json: {user: user}, status: :ok
  else
    render json: {}, status: :unauthorized
  end
end
4
0
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
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?