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

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

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

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

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

Ruby on Rails

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

Q&A

解決済

2回答

711閲覧

herokuで ActionController::RoutingError (No route matches [POST](ローカルでは問題なく動作)

uym

総合スコア0

Ruby

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

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

Ruby on Rails

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

0グッド

0クリップ

投稿2021/01/12 08:35

編集2021/01/13 08:17

前提・実現したいこと

初めて質問の投稿をします。
足りない情報があれば教えていただけますと幸いです。

現在rubyで振り返りツールを作成しています。
管理者は他のメンバーの投稿に対して評価コメントを入力できるように実装しており、
あるメンバーのある投稿に対して評価コメントを保存すると、そのメンバーの投稿一覧に遷移するようにしています。
このとき、ローカル環境ではきちんと遷移するのですが
herokuではThe page you were looking for doesn't exist.となってしまいます。

本来戻りたいパスは/admin/@evaluation.appointment.user.idになり
ローカル環境では問題なく保存も遷移もできています。
エラー文をみると行き先が/appointments/appointment.id/evaluations/evaluation.idになっているので、ここがおかしいのではないかと考えているのですが解決方法がわからない状況です。

herokuでもきちんと遷移させるためにはどうすれば良いかアドバイスをいただきたいです。
よろしくお願いいたします。

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

ターミナル

2021-01-12T07:45:49.894913+00:00 app[web.1]: [6a0e118d-e0ed-449c-99e8-b40e864bbb2f] ActionController::RoutingError (No route matches [POST] "/appointments/11/evaluations/1"): 2021-01-12T07:45:49.894914+00:00 app[web.1]: [6a0e118d-e0ed-449c-99e8-b40e864bbb2f] #中略 2021-01-12T07:45:49.897364+00:00 heroku[router]: at=info method=POST path="/appointments/11/evaluations/1" host=appt-fb.herokuapp.com request_id=6a0e118d-e0ed-449c-99e8-b40e864bbb2f fwd="111.239.185.101" dyno=web.1 connect=0ms service=19ms status=404 bytes=1902 protocol=http

該当のソースコード

EvaluationsController

1def edit 2 @appointment = Appointment.find(params[:appointment_id]) 3 @evaluation = Evaluation.find_by(appointment_id:@appointment.id) 4 end 5 6 def create 7 @evaluation = Evaluation.find_or_initialize_by(appointment_id: evaluation_params[:appointment_id]) 8 if @evaluation.new_record? 9 @evaluation = Evaluation.new(evaluation_params) 10 @evaluation.save! 11 redirect_to "/admins/#{@evaluation.appointment.user.id}" 12 else 13 @evaluation.update(evaluation_params) 14 redirect_to "/admins/#{@evaluation.appointment.user.id}" 15 end 16 end 17 18 def update 19 @evaluation = Evaluation.find_or_initialize_by(appointment_id: evaluation_params[:appointment_id]) 20 if @evaluation.update(evaluation_params) 21 redirect_to "/admins/#{@evaluation.appointment.user.id}" 22 else 23 render :edit 24 end 25 end 26

routes

1Rails.application.routes.draw do 2 devise_for :users 3 root to: 'appointments#index' 4 resources :checks 5 resources :admins, only: [:index, :show] 6 resources :appointments do 7 resources :evaluations, only: [:index, :create, :edit, :update] 8 end 9end

view

1<div class="input-contents"> 2 <div class="input-main"> 3 <h2 class="input-title"><%= @appointment.company %></h2> 4 <%= form_with model: @evaluation, url: appointment_evaluation_path, local: true do |f| %> 5 6 <div class="new-appt"> 7 チェック項目 8 <br> <span class="annotation">※点数は0~5点(半角)で入力してください</span> 9 </div> 10 11 #中略 12 13 コメント 14 <div> 15 <br> <%= f.text_area :comment, class:"appt_comment", id:"content"%> 16 </div> 17 18 <div class="input-btn-contents"> 19 <%= f.submit "更新", class:"appt-input-btn" %> 20 <%=link_to 'もどる', :back, class:"back-btn" %> 21 </div> 22 23 <% end %> 24 </div> 25 </div>

試したこと

・redirect_to "/admins/#{@evaluation.appointment.user.id}"
の記述がおかしいのかと思い、root_pathに飛ぶように修正してみましたが同じエラーが出ました。

・heroku上のデータベースを削除し、再度migrateしましたが挙動は変わりませんでした。
・heroku restartを行いましたが挙動は変わりませんでした。
・routes.rbで直接行き先を変更しようと思い、
post 'appointments/:id/evaluations/:id', to: 'evaluations#create'
の記述を追加したところ、質問に記述しているエラーではなく
ActionController::ParameterMissing (param is missing or the value is empty: evaluation)でstatus=400になってしまいました。

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

ruby 6.0.0

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

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

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

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

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

guest

回答2

0

自己解決

viewの記述を
<%if @evaluation.nil?%>
//evaluationをcreateするform
<%else%>
//evaluationをupdateするform
<% end %>
と場合わけをしたところ解決しました。

ひとつのform_withを用いてcreateもupdateもしようとしていたため
Routing Errorになっていたようです。

ご確認いただいた方、本当にありがとうございました。

投稿2021/01/14 03:25

uym

総合スコア0

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

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

0

<%= form_with model: @evaluation, url: appointment_evaluation_path, local: true do |f| %>

ここのappointment_evaluation_pathに引数で2つのid(appointmentとevaluationのid)を渡して、commit push and heroku pushするとどうでしょうか?

投稿2021/01/12 15:27

hm0456

総合スコア2

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

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

uym

2021/01/13 02:44

ご回答いただきましてありがとうございます!! <%= form_with model: @evaluation, url: appointment_evaluation_path(appointment_id:@appointment.id, evaluation_id:@evaluation.id), local: true do |f| %> としてみましたところ、またローカルでは問題なく挙動するのですが herokuでは評価コメントの入力ページに飛ぼうとした時点で We're sorry, but something went wrong.のエラーメッセージが出るようになりました。 ターミナルのエラー文はActionView::Template::Error (undefined method `id' for nil:NilClass)となっており、いろいろ試してみたところ、@evaluationがnilになっているようです。 まずはこのエラーを解決しないことにはhm0456様からいただいたご回答の検証ができないと思うので、@evaluationがnilにならない方法を考えてみます><
hm0456

2021/01/13 03:12

ご返信ありがとうございます。 ということは、ご質問にあったDBリセットをしていることが原因そうですね。 view内で、@evaluationがある、ないで条件分岐するのはどうでしょうか?
uym

2021/01/13 03:32

ありがとうございます! view内で@evaluationを利用しているのは、先ほど追加した <%= form_with model: @evaluation, url: appointment_evaluation_path(appointment_id:@appointment.id, evaluation_id:@evaluation.id), local: true do |f| %> の部分だけなのですが、このform_with自体を条件分岐するという認識であってますでしょうか? 理解力が乏しく申し訳ございません><
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問