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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

1328閲覧

コメント機能実装中、showアクションを実行した際、「ActionController::UrlGenerationError」エラーになった

akaki

総合スコア15

Ruby on Rails 5

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

Ruby on Rails

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

0グッド

0クリップ

投稿2020/05/13 15:42

編集2020/05/14 02:58

前提・実現したいこと

コメント機能を実装しています。コメント用のform_withコードを追記した「投稿内容の詳細」を見ようとshowアクションを実行した際、「ActionController::UrlGenerationError」エラーになったため解決をしたいです。

⬇︎エラーになる場面の動画⬇︎
リンク内容

⬇︎エラーの画像⬇︎
リンク内容

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

ActionController::UrlGenerationError in Cafeterias#show Showing /Users/takumi/soup/app/views/cafeterias/show.html.haml where line #45 raised: No route matches {:action=>"create", :controller=>"comments", :id=>"12"}, missing required keys: [:cafeteria_id]

該当のソースコード

CafeteriasController

1class CafeteriasController < ApplicationController 2 before_action :authenticate_user!, except: %i[index show] 3 before_action :set_cafeteria, only: [:show, :edit] 4 5 def index 6 @user = current_user 7 @cafeterias = Cafeteria.includes(:user).order("created_at DESC").page(params[:page]).per(6) 8 end 9 10 def new 11 @user = current_user 12 @cafeteria = Cafeteria.new 13 end 14 15 def create 16 Cafeteria.create(cafeteria_params) 17 redirect_to cafeterias_path 18 end 19 20 def show 21 @user = current_user 22 @comment = Comment.new 23 @comments = @cafeteria.comments.includes(:user) 24 end 25 26 def edit 27 @user = current_user 28 end 29 30 def update 31 cafeteria = Cafeteria.find(params[:id]) 32 cafeteria.update(cafeteria_params) 33 redirect_to cafeteria_path(cafeteria.id) 34 end 35 36 def destroy 37 cafeteria = Cafeteria.find(params[:id]) 38 cafeteria.destroy 39 redirect_to cafeterias_path 40 end 41 42 private 43 def cafeteria_params 44 params.require(:cafeteria).permit(:name, :image, :detail, :addres).merge(user_id: current_user.id) 45 end 46 47 def set_cafeteria 48 @cafeteria = Cafeteria.find(params[:id]) 49 end 50 51end 52

ShowHtmlHaml

1.container 2 - if current_user 3 = form_with model: [@cafeteria, @comment], class: "form", url: cafeteria_comments_path, local: true do |f| 4 .field 5 = f.label :text, "コメントを投稿する", class: "label" 6 = f.text_area :text, placeholder: "コメント内容", rows: "3" 7 = f.submit "SEND", class: "comment-btn" 8 - else 9 %strong 10 %p ※※※ コメントの投稿には新規登録/ログインが必要です ※※※ 11 .comments 12 %h4 <コメント一覧> 13 - if @comments 14 - @comments.each do |comment| 15 %p 16 %strong 17 = link_to comment.user.username, "/users/#{comment.user_id}" 1819 = comment.text

CommentsController

1class CommentsController < ApplicationController 2 def create 3 comment = Comment.create(comment_params) 4 redirect_to "/cafeterias/#{comment.cafeteria.id}" 5 end 6 7 private 8 def comment_params 9 params.require(:comment).permit(:text).merge(user_id: current_user.id, cafeteria_id: params[:cafeteria_id]) 10 end 11end

⬇︎<追記:ルーティングコードの記載>⬇︎

routes

1Rails.application.routes.draw do 2 devise_for :users 3 root to: "top#index" 4 resources :top, only: :index 5 resources :cafeterias do 6 resources :comments, only: :create 7 end 8 resources :users, only: [:show, :edit, :update] 9end

⬇︎<さらに追記:form_withのurlを消した後のエラー>⬇︎
リンク内容
このように、「cafeterium_comments_path」という、まったく身に覚えのないパスが定義されていないというエラーになってしまいます・・・。

⬇︎rails routes の結果(コメントのpath)⬇︎

cafeteria_comments POST /cafeterias/:cafeteria_id/comments(.:format) comments#create

試したこと

ここに問題に対して試したことを記載してください。

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

rails 5.2.4.2

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーの中にmissing required keys: [:cafeteria_id]とありますので、
このcafeteria_idが存在しないのが原因かと思われます。

showのHTMLを見ると、

= form_with model: [@cafeteria, @comment], class: "form", url: cafeteria_comments_path, local: true do |f|

model:[@cafeteria,@comment]となっていますが、
@cafeteriaというのはControllerのshowアクションを見ても存在しませんので、
この辺が原因じゃないかなと思います。

投稿2020/05/13 16:37

gnfreeworks

総合スコア306

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

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

akaki

2020/05/14 00:30

コメントありがとうございます!@cafeteriaは、Controllerの一番下でset_cafeteriaとしてshowアクションに定義しているので、大丈夫だと思っていました。 cafeteria_idがなぜnilになるのかがまだ分からないので、ご教授頂けると幸いです、、!
gnfreeworks

2020/05/14 01:31

すみません、Controllerの下で@cafeteria宣言されてましたね。見逃してました。 となるとあとは`No route matches {:action=>"create", :controller=>"comments", :id=>"12"}`が怪しいのですが、ルーティングがおかしいのかもしれません。 routes.rbのコードも記載頂いてもいいでしょうか?
akaki

2020/05/14 02:15

ありがとうございます! routes.rbのコードを一番下に追記で記載致しました。 お忙しいところ恐縮です。宜しくお願いします!
gnfreeworks

2020/05/14 02:39

routes.rbのコードありがとうございます。 気になったのはやはりshow.html.hamlのform_withなのですが、 = form_with model: [@cafeteria, @comment], class: "form", url: cafeteria_comments_path, local: true do |f| の url: cafeteria_comments_path がおかしいかもしれません。 あくまで推測ですが、いただいたルーティングを`rake routes`で確認したところ、 cafeteria_comments_pathには引数(id)が必要になるようです。 cafeteria_comments POST /cafeterias/:cafeteria_id/comments(.:format) comments#create form_withの場合、渡されたmodelに合わせて新規か編集かを判断してURLを決めてくれます。 しかし今回の場合、modelが渡されており、なおかつurlも記載しているためどちらに飛ぶか分からない上に、恐らくurlで記述したURLに飛んでいると思われますがこのurlには引数(id)が無いため特定できません。 その辺りのルーティングがおかしくなってページが表示できない可能性があるのかと。 一度urlを削除したこのコードに置き換えてみてもらえますか? = form_with model: [@cafeteria, @comment], class: "form", local: true do |f|
akaki

2020/05/14 02:47

とても丁寧にありがとうございます。 = form_with model: [@cafeteria, @comment], class: "form", local: true do |f| にしたところ、 undefined method `cafeterium_comments_path' というエラーになってしまいました。 cafeteriumは設定したことがないため、なぜこのようなエラーになるのかが不思議なのですが・・・ お時間いただいて恐縮です。私の方でももう少し調べてみます。
gnfreeworks

2020/05/14 03:05

Railsが勝手にprefixを振ってるんでしょうけど..."cafeterium"は調べたらデンマーク語みたいです。 余計に謎が深まってしまいましたね。。 お力になれず申し訳ありません。
akaki

2020/05/14 04:57

了解です!ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問