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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

1409閲覧

『form_withでのNoMethodErrorで困っています』

yasu0205

総合スコア4

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2021/04/03 07:50

『form_withでのNoMethodErrorで困っています』

現在protospaceというアプリ作成中です
投稿した(作成した)プロトタイプに対してコメントを投稿できるのですが、
このコメント投稿実装中に次の画像の様なエラーが発生しました
https://gyazo.com/b23aebfda51c93301e408bce4052f98d

具体的にはソースコード4つめの”_prototype.html.erb”にて
3つあるリンクのうち、上2つがprototype詳細画面に遷移するものなのですがそちらをクリックすると
上の様なエラーが表示されます

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

NoMethodError in Prototypes#show undefined method `prototype_comments_path' for #<#<Class:0x00007fe894c66f18>:0x00007fe8944bc600> Did you mean? prototype_path

該当のソースコード

prototypes_controller.rb

class PrototypesController < ApplicationController def index @prototype = Prototype.all.includes(:user) end def new @prototype = Prototype.new end def create @prototype = Prototype.new(prototype_params) if @prototype.save redirect_to root_path else render :new end end def show @prototype = Prototype.find(params[:id]) @comment = Comment.new @comments = @prototype.comments.includes(:user) end def edit @prototype = Prototype.find(params[:id]) end def update prototype = Prototype.find(params[:id]) if prototype.update(prototype_params) redirect_to prototype_path(prototype.id) else @prototype = Prototype.find(params[:id]) render :edit end end def destroy @prototype = Prototype.find(params[:id]) @prototype.destroy redirect_to root_path end private def prototype_params params.require(:prototype).permit(:title, :catch_copy, :concept, :image).merge(user_id: current_user.id) end end

comments_controller.erb

class CommentsController < ApplicationController def create @comment = Comment.new(comment_params) if @comment.save redirect_to prototype_path(@comment.prototype.id) else @prototype = @comment.prototype @comments = @prototype.comments render "prototypes/show" end end private def comment_params params.require(:comment).permit(:text).merge(user_id: current_user.id, prototype_id: params[:prototype_id]) end end

prototypes/index.html.erb

<main class="main"> <div class="inner"> <%# ログインしているときは以下を表示する %> <% if user_signed_in? %> <div class="greeting"> こんにちは、 <%= link_to "#{current_user.name}さん", user_path(current_user.id), class: :greeting__link%> </div> <% end %> <%# // ログインしているときは上記を表示する %> <div class="card__wrapper"> <%# 投稿機能実装後、部分テンプレートでプロトタイプ投稿一覧を表示する %> <%= render partial: 'prototype', collection: @prototype %> </div> </div> </main>

_prototype.html.erb

<div class="card"> <%= link_to image_tag(prototype.image, class: :card__img ), prototype_path(prototype.id) %> <div class="card__body"> <%= link_to "prototype.title", prototype_path(prototype.id), class: :card__title%> <p class="card__summary"> <%= "prototype.catch_copy" %> </p> <%= link_to "by #{prototype.user.name}", user_path(prototype.user_id), class: :card__user %> </div> </div>

試したこと

エラー文通り、form_with内のモデルを色々変えてみたりしました。
prototypesコントローラー内のshowアクションも見直しました

※コメント機能追加以前ではこのようなエラーは発生せず、リンクから詳細ページに飛べていました

お力貸していただけると助かります

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

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

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

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

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

guest

回答1

0

ベストアンサー

form_withは、引数として渡したinstance変数(今回でいうところの@comment@prototype)に基づいて遷移先のURLを生成しようとします。

その過程でprototype_comments_pathというメソッドが自動的に呼び出されているように見えます。

おそらくですが、form_withに対して@commentを渡さなければひとまずエラーは回避できるでしょう。


もしくは、routes.rbを修正し、prototype_comments_pathというメソッドが生成されるようなroutingを追加するのも手の一つです。

投稿2021/04/03 12:50

編集2021/04/03 12:51
siruku6

総合スコア1382

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

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

yasu0205

2021/04/03 14:14 編集

siruku6さんのおっしゃる通りprototype_comments_pathがrails routes で確認できなかったので、 routes.rb修正してクリアできました!! ありがとうございます
siruku6

2021/04/04 06:40

おぉ! そっちの方法で試されるとは、できる方でしたね!! これからもぜひ頑張ってください!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問