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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

1回答

2283閲覧

AbstractController::DoubleRenderErrorが出てしまう。

kie

総合スコア5

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

0クリップ

投稿2021/09/13 12:10

前提・実現したいこと

ruby on railsにてレビューアプリを作成しています。
エラー文を読むと「redirect_to(...)andreturn」のような記述をしてくださいと記述されていますがその記述はしてあります。

発生している問題・エラーメッセージ

AbstractController::DoubleRenderError in ReviewsController#create 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". Extracted source (around line #17): def create   @reviews = Review.new(review_params) render json:{ reviews: @reviews } if @reviews.save  redirect_to root_path else render :new and return end end

該当のソースコード

ruby

1class ReviewsController < ApplicationController 2 3 def index 4 @reviews = Review.all 5 end 6 7 def new 8 @reviews = Review.new 9 end 10 11 def create 12 @reviews = Review.new(review_params) 13 render json:{ reviews: @reviews } 14 if @reviews.save 15 redirect_to root_path 16 else 17 render :new and return 18 end 19 end 20 21 22 private 23 24 def redirect_root 25 redirect_to root_path unless current_user.id == @reviews.user_id 26 end 27 28 def review_params 29 params.require(:reviews).permit(:image,:title,:category_id,:detail,:directer,:starring,:rate).merge(user_id: current_user.id) 30 end 31 32end

javascript

1function post (){ 2 const submit = document.getElementById("review-btn"); 3 submit.addEventListener("click", (e) => { 4 const formData = new FormData(document.getElementById("new_reviews")); 5 const XHR = new XMLHttpRequest(); 6 XHR.open("POST", "/reviews", true); 7 XHR.responseType = "json"; 8 XHR.send(formData); 9 XHR.onload = () => { 10 const item = XHR.response.article; 11 const contentsArea = document.getElementById("contents_area"); 12 const articleText = document.getElementById("reviews_text"); 13 const HTML = ` 14 <div class="reviews"> 15 ${ item.text } 16 </div>`; 17 contentsArea.insertAdjacentHTML("afterbegin", HTML); 18 reviewsText.value = ""; 19 }; 20 e.preventDefault(); 21 }); 22}; 23 24window.addEventListener('load', post); 25

試したこと

render :new and returnの記述をコメントアウトした所、下記のようにデータのみ表示される状態になってしましました。

{"reviews":{"id":null,"title":null,"category_id":null,"detail":null,"directer":null,"starring":null,"rate":4.0,"user_id":3,"created_at":null,"updated_at":null}}

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーメッセージのとおりです。renderredirect_toは1つのアクションの中で1回しか実行できません。

投稿2021/09/13 12:32

maisumakun

総合スコア146018

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

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

kie

2021/09/13 14:02

エラー文を検索した所、「and return」と記述すればエラーは解消されるとのことだったため、「and return」を記述したのですが、rebder自体を削除しなければならないということでしょうか? また、render自体を削除してもトップ画面に戻るのではなく、データのみ(文字列)が記載されたページに遷移されてしまします・・・
maisumakun

2021/09/13 14:04 編集

> エラー文を検索した所、「and return」と記述すればエラーは解消されるとのことだったため、 小手先の技に頼るのではなく、意味を考えてください。2回めのrenderの後にreturnしても、「renderを2回実行した」という事実には何ら影響しません。 > また、render自体を削除してもトップ画面に戻るのではなく、データのみ(文字列)が記載されたページに遷移されてしまします・・・ 上に書いたrenderの返す結果です。
kie

2021/09/13 15:15

お返事ありがとうございます。2回目に実行されるrenderにand returnを記述しても意味がないことはわかりました。 自分なりに試行錯誤した結果、何度もこのエラーが出てきてしまい困っています。 エラー解消のため、どの記述をどのように訂正すればいいのか教えて欲しいです。 初歩的な質問ですみません。
maisumakun

2021/09/13 22:24

そもそも論として、createアクションで、保存する前にrenderを行ってしまうというのが意味が通らないと考えます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問