質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

3200閲覧

RailsでDoubleRenderErrorの解消方法を教えていただけないでしょうか?

koume

総合スコア458

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

2グッド

1クリップ

投稿2019/05/19 15:04

開発環境ではなぜかエラーは出なかったのですが、Railsアプリをデプロイし、初期データを入力、登録すると「DoubleRenderError」が発生してしまいます。

production.log 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".):

コントローラー内の同じメソッドにrenderとredirectを混在してはいけません!と言われていてand returnでメソッドから抜けてください。と言われているのだと思います。

対象のアクションが記述されているcontrollerは以下になります。(ごちゃごちゃしているので問題部分を抜粋しました。)

customers_controller.rb def create x = @customer_form.customer.home_address @i = x.city if @i =~ /市$/ city_crear elsif @i =~ /区$/ city_crear elsif @i =~ /町$/ city_crear elsif @i =~ /村$/ city_crear else flash.now.alert = '市、区、町、村のみ入力してください。' render action: 'new' and return end end def city_crear if XXXXXXX else reg_success end end def reg_success @customer_form = Visitor::CustomerForm.new @customer_form.assign_attributes(params[:form]) @change = @customer_form.customer if @customer_form.save if @change.hogehoge == 'aaa' @change.hogehoge = 'bbbbb' @change.save end flash.notice = '新規に登録しました。' redirect_to :visitor_root   #(ここにand returnを追記??) user = @customer_form.customer ThanksMailer.thank_you(user).deliver_now else flash.now.alert = '入力に誤りがあります。' render action: 'new' and return end end

このような感じでcreateメソッドからcity_crearメソッドを呼び出し、さらにreg_successメソッドを呼び出し、実行しています。

エラー「We're sorry, but something went wrong.」は発生していますが、データの登録はできていました。

想定する動作は、データを登録した後でvisitor_rootの画面を表示し、コメント「新規に登録しました。」を表示し、お礼のメールを送信することを想定していました。
冒頭で記述したとおりproduction.logにDoubleRenderErrorエラーが出ているので「redirect_to :visitor_root」でエラーが発生しているのかと思います。

疑問なのが、「redirect_to :visitor_root」の後にand returnを追記するだけで解決出来るのでしょうか?

考え過ぎかもしれませんがメソッド内でメソッドを呼び出すと、renderかredirectを1回使用したことになったりするのでしょうか?

どなたかご教示のほど宜しくお願いいたします。

set0gut1👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Railsで500 Internal Server Errorが発生してしまい原因がわからずに困っています。
teratail:190283

↑この質問と関係ある気がします。

リダイレクトの後のメール送信にて例外が発生し、エラー画面の render が行われて DoubleRenderError になってるのではないかと。
「リダイレクト→メール送信」の順番を入れ替えて「メール送信→リダイレクト」とすると、メール送信で例外が発生した場合はそれより後のリダイレクトは行われなくなり DoubleRenderError は消えるような気がします。

投稿2019/05/19 22:14

set0gut1

総合スコア2413

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

koume

2019/05/20 13:33

回答有り難うございます。解決はできていませんが500 Internal Server Errorとの関連性の指摘をいただいただけで、考え方が少し前進しました。 このエラーは先送りにして、とりあえず500 Internal Server Errorを解決し、再度、確認して見たいと思います。今後とも宜しくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問