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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

2121閲覧

本番環境(Heroku)で投稿が失敗してしまいます。

yamady

総合スコア176

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2017/07/24 11:40

いつもお世話になっております。

前提・実現したいこと

口コミサイトをrailsで作っています。
ローカル環境ではうまくいくのですが、なぜか本番環境(Heroku)でページの遷移エラーが発生してしまいます。口コミを投稿する際に発生するエラーです。

エラーメッセージ

ruby

1app[web.1]: Processing by ReviewsController#new as HTML 2app[web.1]: Parameters: {"area_slag"=>"A013", "id"=>"459"} 3app[web.1]: Review Load (1.3ms) SELECT "reviews".* FROM "reviews" WHERE "reviews"."id" = $1 ORDER BY "reviews"."created_at" DESC LIMIT $2 [["id", 459], ["LIMIT", 1]] 4app[web.1]: Completed 404 Not Found in 4ms (ActiveRecord: 1.3ms) 5app[web.1]: ActiveRecord::RecordNotFound (Couldn't find Review with 'id'=459): 6app[web.1]: app/controllers/reviews_controller.rb:49:in `set_review'

##該当するソースコード

ビュー

ruby

1 <div class="container"> 2 <%= f.hidden_field :space_id, value: @review.space.id %> 3 <div class="post-rate"> 4 <!-- ここにStar Rateが入ります --> 5 <div class="form-group"> 6 <label for="rate">評価</label> 7 <%= f.select :rate, {'1' => 1, '2' => 2, '3' => 3, '4' => 4, '5' => 5,}, class: "form-control" %> 8 </div> 9 </div> 10 <div class="post-contents"> 11 <!-- ここにReview内容が入ります --> 12 <div class="form-group"> 13 <label for="textarea">口コミを入力</label> 14 <%= f.text_area :content, class: "form-control", placeholder: "口コミ内容", rows: "5" %> 15 </div> 16 </div> 17 <div class="post-photo"> 18 <label for="textarea">画像を投稿</label> 19 <%= f.fields_for :review_image do |review_image| %> 20 <%= review_image.file_field :image %> 21 <% end %> 22 </div> 23 <div class="post-btn"> 24 <%= f.submit "投稿する", class: "button-review" %> 25 </div> 26 <% end %> 27 </div> 28 </div>

reviews_controller.rb

ruby

1class ReviewsController < ApplicationController 2 before_action :set_review, only:[:new, :show, :edit, :update, :destroy] 3 4 def create 5 @review = current_user.reviews.create(create_params) 6 if @review.save 7 flash[:success] = "口コミが投稿されました!" 8 redirect_to root_path 9 else 10 flash[:alert] = "口コミの投稿に失敗しました。" 11 redirect_to root_path 12 end 13 end 14 15 def update 16 if @review.update_attributes(create_params) 17 flash[:success] = "口コミが更新されました" 18 redirect_to @review 19 else 20 render 'edit' 21 end 22 end 23 24 def new 25 if signed_in? 26 @post = current_user.reviews.build 27 @post.build_review_image 28 end 29 end 30 31 def destroy 32 @review.destroy 33 flash[:success] = "口コミが削除されました" 34 redirect_to request.referrer || root_url 35 end 36 37 def edit 38 end 39 40 private 41 42 def set_review 43 @review = Review.find(params[:id]) 44 end 45 46 def create_params 47 params.require(:review).permit(:id, :content, :rate, :title, :space_id, :user_id, review_image_attributes: [:image]) 48 end 49 50 def correct_user 51 @review = current_user.reviews.find_by(id: params[:id]) 52 redirect_to root_url if @review.nil? 53 end 54end

すみませんが、どうかおたすけください(汗)

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーメッセージの意味するところは、(そのままですが)「ID: 459のReviewがないよ」です。

で、なんでそのエラーが表示されるかというと、newをレンダリングするときにset_reviewをしているからだと思うんですよね。
show,edit,updateとかdeleteの際にはすでにあるレコードを参照するので、set_reviewするでしょうが、
newとかcreateの場合は新規で作るのでset_reviewはいらないんじゃないかと?

その際にもset_reviewしてしまうと、params[:id]の値でReviewを探しにいってしまうので、例えばURL構成が以下の場合には親のIDでreviewを探してしまいます。
http://xxx.herokuapp.com/parents/<親のID>/reviews/new

修正は簡単で

ruby

1before_action :set_review, only:[:new, :show, :edit, :update, :destroy]

ruby

1before_action :set_review, only:[:show, :edit, :update, :destroy]

です

仮に上記のとおりであれば、開発環境はたまたまID:459のReviewがあったんでしょうね。

ですので、開発で見ればエラーにならず

$ rails c > Review.find(459)

本番環境では同様のエラーがでるはずです。

$ heroku run console > Review.find(459)

投稿2017/07/24 12:03

h_daido

総合スコア824

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

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

yamady

2017/07/24 14:12

h_daido 様 ご丁寧にかつ、迅速なご回答をいただきまして 誠にありがとうございます。 いただいたように、set_reviewを削除したみたところ、spaceが見つからないエラーが生じました。なので、@review = Review.find(params[:id])のところを@space = Space.find(params[:id])にして、ビューを@review.〜から@space.〜に変更してみたところ通りました。 ローカル環境と、本番環境でテストの内容が異なるが故のエラーですね。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問