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

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

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

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

Ruby on Rails

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

Q&A

解決済

4回答

1905閲覧

コメントを投稿するとNoMethodErrorが出る。コメントを投稿できるようにしたい。

nagai22

総合スコア0

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2020/10/30 05:13

前提・実現したいこと

コメント機能の実装をしている。
コメントを投稿させたい。

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

コメントを投稿すると以下のNoMethodErrorが出る

NoMethodError in Prototypes#show Showing /Users/daisuke/projects/protospace-31648/app/views/prototypes/show.html.erb where line #36 raised: undefined method `comment_prototype_path' for #<#<Class:0x00007f97739a5440>:0x00007f976f356c28> Did you mean? prototype_comments_path

コメント投稿後のエラー画面

該当のソースコード

ruby

1#routes.rb 2 3devise_for :users 4 root to: "prototypes#index" 5 resources :prototypes do 6 resources :comments, only: [:create] 7 end

ruby

1#comments_controller.rb 2 3def create 4 @comment = Comment.new(comment_params) 5 if @comment.save 6 redirect_to prototype_path(@comment.prototype) 7 else 8 render :show 9 end 10 11 12 end 13 14 private 15 16def comment_params 17 params.require(:comment).permit(:text).merge(user_id: current_user.id, prototype_id: params[:prototype_id]) 18end 19 20end 21

ruby

1#prototypes_controller.rb 2 3def index 4 @prototypes = Prototype.all 5 end 6 7 def new 8 @prototype = Prototype.new 9 end 10 11 def create 12 if Prototype.create(prototype_params) 13 redirect_to root_path 14 else 15 render :new 16 end 17 end 18 19 def show 20 @prototype = Prototype.find(params[:id]) 21 end 22 23 def edit 24 @prototype = Prototype.find(params[:id]) 25 end 26 27 def update 28 prototype = Prototype.find(params[:id]) 29 if prototype.update(prototype_params) 30 redirect_to prototype_path 31 else 32 render :edit 33 end 34 end 35 36 def destroy 37 prototype = Prototype.find(params[:id]) 38 if prototype.destroy 39 redirect_to root_path 40 end 41 end 42 43 private 44 45 def prototype_params 46 params.require(:prototype).permit(:title, :catch_copy, :concept, :image).merge(user_id: current_user.id) 47 end 48

ruby

1#show.html.erb 2 3<% if current_user %> 4 <%= form_with(model: [@comment, @prototype], local: true) do |f|%> 5 <div class="field"> 6 <%= f.label :text, "コメント" %><br /> 7 <%= f.text_field :text %> 8 </div> 9 <div class="actions"> 10 <%= f.submit "送信する", class: :form__btn %> 11 </div> 12 <% end %> 13 <% end %>

試したこと

show.html.erbのform_withで渡されるモデル名のメソッドが正しく作られていないと思ったので、comments_controller.rbのcreateアクションを確認したが問題はなさそう。

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

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

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

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

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

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

guest

回答4

0

解決方法

prototypes_controllerのshowアクション内に以下が記述されていなかった。

ruby

1@comment = Comment.new

投稿2020/10/30 05:54

nagai22

総合スコア0

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

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

0

解決方法

prototypes_controllerのshowアクション内に

ruby

1@comment = Comment.new

が記述されていなかった。

投稿2020/10/30 05:53

nagai22

総合スコア0

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

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

0

自己解決

解決方法

prototypes_controllerのshowアクション内に

ruby

1@comment = Comment.new

が記述されていなかった。

投稿2020/10/30 05:47

nagai22

総合スコア0

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

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

0

<%= form_with(model: [@comment, @prototype], local: true) do |f|%>

modelの順番が逆では?

erb

1<%= form_with(model: [@prototype, @comment], local: true) do |f|%>

投稿2020/10/30 05:27

asm

総合スコア15147

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

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

nagai22

2020/10/30 05:40

modelの順を逆にしてみましたが、エラー内容は変わりませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問