前提・実現したいこと
プロトタイプという画像とテキストをあわせたものを投稿できる機能を持ったアプリを作成しています。
投稿されたプロトタイプの詳細ページにて他のユーザーがその投稿にコメントするという機能の中で、コメントが正しく保存されればそのページにリダイレクトして、失敗すればrenderを用いてそのページに留まるという条件分岐を設定したいのですが、失敗したときのrenderの処理がうまくいきません。
発生している問題・エラーメッセージ
NoMethodError in Comments#create undefined method `title' for nil:NilClass エラー発生箇所はビューファイル内のインスタンス変数が記述されている場所だと表示されています。
該当のソースコード
app/controllers/comments_controller.rb
rb
1class CommentsController < ApplicationController 2 def create 3 @comment = Comment.new(comment_params) 4 if @comment.save 5 # コメントが保存された場合の処理 6 redirect_to "/prototypes/#{@comment.prototype.id}" 7 else 8 # コメントの保存に失敗した場合の処理 9 render "prototypes/show" 10 end 11 end 12 13 private 14 def comment_params 15 params.require(:comment).permit(:text).merge(user_id: current_user.id, prototype_id: params[:prototype_id]) 16 end 17end
app/controllers/prototypes_controller.rb
rb
1class PrototypesController < ApplicationController 2 before_action :move_to_index, except: [:index, :show, :new, :create] 3 before_action :authenticate_user!, except: [:index, :show] 4 5# 省略 6 7 # プロトタイプの詳細ページを表示させるshowアクション 8 def show 9 @prototype = Prototype.find(params[:id]) 10 @comment = Comment.new 11 @comments = @prototype.comments.includes(:user) 12 end 13 14 def destroy 15 prototype = Prototype.find(params[:id]) 16 prototype.destroy 17 redirect_to root_path 18 end 19 20# 省略
app/views/prototypes/show.html.erb
erb
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 }", user_path(@prototype.user.id), 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 "削除する", prototype_path, method: :delete, class: :prototype__btn %> 12 </div> 13 <% end %> 14 <div class="prototype__image"> 15 <%= image_tag(@prototype.image) %> 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
試したこと
[エラーから読み取れること]
ビューファイルで使われるインスタンス変数が空になってしまっているため、ビューを表示させることができない
showアクション内でインスタンス変数を記述しているのに、なぜ変数が空になってしまっているのか分かりません。
どこに間違いがあるのかご教授していただけると幸いです。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/08 02:26