前提・実現したいこと
コメント機能の実装に取り組んでおり、その際に出たエラーについて質問があります。
コメント機能のフォームを作ろうとform_withを設定し、コメントフォームを搭載したページに遷移したところ、NoMethodエラーが発生しました。
⬇︎エラーメッセージ「undefined method `cafeterium_comments_path' 」
しかし、「cafeterium_comments_path」の「cafeterium」は全く身に覚えがありません。
ずっとcafeteriaで作業をしていたため、「cafeteria_comments_path」を自動的に読み込んでくれるはずですが、なぜかrails側が勝手にprefixを「cafeterium_comments_path」に変えてpathを読み込もうとし、NoMethodエラーになってしまっています。
こちらを改善し、通常通り「cafeteria_comments_path」が読み込まれるようにしたいです。ご教授いただけると幸いです。
発生している問題・エラーメッセージ
undefined method `cafeterium_comments_path'
該当のソースコード
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", 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}" 18 : 19 = 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:cafeteria_comments_pathを記入したところ、下記のようなエラーになりました>⬇︎
⬇︎エラー場面の動画
⬇︎エラー画像
エラー内容
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=>"11"}, missing required keys: [:cafeteria_id]
cafeteria_idがないと言われていますが、commentsテーブルにしっかり記載されています。
また、form_tagなどで同様に取り組んだところ、同じエラーになってしまいます。
原因は何が考えられるでしょうか…ご教授いただけると幸いです。
試したこと
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/14 09:43
2020/05/14 09:44
2020/05/14 10:21
2020/05/14 10:22
2020/05/14 10:25 編集
2020/05/14 10:28
2020/05/14 10:32 編集
2020/05/14 13:23