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

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

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

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

Q&A

解決済

1回答

978閲覧

NoMethodError in Comments#createを解決したい

tattobu

総合スコア16

Ruby

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

0グッド

0クリップ

投稿2021/10/15 08:36

前提・実現したいこと

コメント投稿機能の実装を行っている最中にエラーが出てしまい進めずにいます。
初めての投稿でいたらない点があるかもしれませんが、よろしくお願いいたします。

エラー文にundefined method `title' for nil:NilClassとありtitleが定義されていないという意味かと思うのですが、どこが原因なのか解決できずにいます。

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

Showing /Users/tattobu/projects/protospace-36479/app/views/prototypes/show.html.erb where line #5 raised: undefined method `title' for nil:NilClass Parameters: {"authenticity_token"=>"h88XvpncDzBJRVLz3OOVdM0G7UI49af7Kd7U7kHFseBxwnqUjZWZgY+PIM/qNziLxLghUTxMHVidXjRcJQQYYw==", "comment"=>{"content"=>"ai"}, "commit"=>"送信する", "prototype_id"=>"2"}

該当のソースコード

prototypes_controller.rb

ruby

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

comments_controller.rb

ruby

1class CommentsController < ApplicationController 2 3 def create 4 @comment = Comment.new(comment_params) 5 if @comment.save 6 redirect_to prototype_path 7 else 8 render "prototypes/show" 9 end 10 end 11 12 private 13 def comment_params 14 params.require(:comment).permit(:content).merge(user_id: current_user.id, prototype_id: params[:prototype_id] ) 15 end 16end 17

show.html.erb

ruby

1<main class="main"> 2 <div class="inner"> 3 <div class="prototype__wrapper"> 4 <p class="prototype__hedding"> 5 <%= @prototype.title %> 6 </p> 7 <%= link_to "by #{@prototype.user.name}", root_path, class: :prototype__user %> 8 <% if user_signed_in? && current_user.id == @prototype.user_id %> 9 <div class="prototype__manage"> 10 <%= link_to "編集する", edit_prototype_path, class: :prototype__btn %> 11 <%= link_to "削除する", "/prototypes/#{@prototype.id}",method: :delete, class: :prototype__btn %> 12 </div> 13 <% end %> 14 <div class="prototype__image"> 15 <%= image_tag @prototype.image if @prototype.image.attached? %> 16 </div> 17 <div class="prototype__body"> 18 <div class="prototype__detail"> 19 <p class="detail__title">キャッチコピー</p> 20 <p class="detail__message"> 21 <%= @prototype.catch_copy %> 22 </p> 23 </div> 24 <div class="prototype__detail"> 25 <p class="detail__title">コンセプト</p> 26 <p class="detail__message"> 27 <%= @prototype.concept %> 28 </p> 29 </div> 30 </div> 31 <div class="prototype__comments"> 32 <% if user_signed_in? %> 33 <%= form_with model: [@prototype,@comment],local: true do |f|%> 34 <div class="field"> 35 <%= f.label :content, "コメント" %><br /> 36 <%= f.text_field :content, id:"comment_content" %> 37 </div> 38 <div class="actions"> 39 <%= f.submit "送信する", class: :form__btn %> 40 </div> 41 <% end %> 42 <% end %> 43 <ul class="comments_lists"> 44 <%# 投稿に紐づくコメントを一覧する処理を記述する %> 45 <li class="comments_list"> 46 <%# <%= " コメントのテキスト "%> 47 <%# <%= link_to "( ユーザー名 )", root_path, class: :comment_user %> 48 </li> 49 <%# // 投稿に紐づくコメントを一覧する処理を記述する %> 50 </ul> 51 </div> 52 </div> 53 </div> 54</main> 55

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

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

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

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

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

guest

回答1

0

ベストアンサー

@comment.save に失敗して render "prototypes/show" が呼ばれてます。

prototypes/show では @prototype が参照されていますが、
CommentsController の create の中で定義されていません。
title ではなく、@prototype が nil です。

prototype はその id が parameters に含まれているので、params[:prototype_id] で参照できます。
この params[:prototype_id] はパスの /prototypes/:prototype_id/comments の :prototype_id の部分になります。

ruby

1 def create 2 @comment = Comment.new(comment_params) 3 if @comment.save 4 redirect_to prototype_path 5 else 6 @prototype = Prototype.find(params[:prototype_id]) 7 render "prototypes/show" 8 end 9 end

投稿2021/10/15 10:54

neko_daisuki

総合スコア2090

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

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

tattobu

2021/10/15 12:52

とても分かりやすく教えてくださりありがとうございます。 おかげさまで解決する事ができました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問