実現したいこと
railsで掲示板を作っています。topics/showページ内に一対多の関係のcommentsを新規投稿と投稿の一覧を表示しようとしています。
AWS Cloud9 を使用しています。どなた様かご教示お願いできましたら幸甚です。
発生している問題・エラーメッセージ
NoMethodError in Comments#create Showing /app/views/topics/show.html.erb where line #6 raised: undefined method `user' for nil:NilClass
該当のソースコード
class CommentsController < ApplicationController before_action :require_user_logged_in before_action :correct_user, only: [:destroy] def create @comment = current_user.comments.build(comment_params) if @comment.save flash[:success] = 'コメントを投稿しました。' redirect_to root_url else @comments = current_user.comments.order(id: :asc) flash.now[:danger] = 'コメントの投稿に失敗しました。' render 'topics/show' end end private def comment_params params.require(:comment).permit(:content) end def correct_user @comment = current_user.comments.find_by(id: params[:id]) unless @comment redirect_to root_url end end end
class TopicsController < ApplicationController before_action :require_user_logged_in before_action :correct_user, only: [:destroy] def show @topic = Topic.find(params[:id]) @comment = current_user.comments.build @comments = @topic.comments.order(id: :asc) end private # Strong Parameter def topic_params params.require(:topic).permit(:title, :condition, :content) end def correct_user @topic = current_user.topics.find_by(id: params[:id]) unless @topic redirect_to root_url end end end
topics/show
<div class="text-right"> <% if current_user == @topic.user %> <%= link_to "編集する", edit_topic_path(@topic), class: 'btn btn-danger w-150px' %> <% end %> </div> <table class="table table-bordered table-striped container mt-3"> <tr> <th class="text-center" colspan="2">タイトル</th> <th class="text-center">募集人</th> <th class="text-center">状態</th> </tr> <tr> <td class="text-center" colspan="2"><%= @topic.title %></td> <td class="text-center"><%= @topic.user.name %></td> <td class="text-center"><%= @topic.condition ? "募集中" : "終了" %></td> </tr> <tr> <th class="text-center">投稿日</th> <td class="text-center"><%= l @topic.created_at, format: :year %></td> <th class="text-center">編集日時</th> <td class="text-center"><%= l @topic.updated_at, format: :short %></td> </tr> <tr> <td class="text-center" colspan="4"><%= @topic.content %></td> </tr> </table> <%= render 'comments/show', comments: @comments %> <h5><strong>質問する コメント投稿欄</strong></h5> <%= form_with(model: @comment, local: true) do |f| %> <div class="form-group row"> <div class="col-12"> <%= f.text_area :content, size: '10x5', class: 'form-control', placeholder: '※投稿にはユーザ登録、ログインが必要です。 250文字以内で投稿をお願いします。' %> </div> </div> <div class="text-right"> <%= f.submit '投稿する', class: 'btn btn-danger w-150px' %> </div> <% end %>
追加、必要な箇所がありましたら申し付けください。
試したこと
binding.pryを試しました。が手に負えません。
From: /app/controllers/comments_controller.rb:9 CommentsController#create: 6: def create 7: @comment = current_user.comments.build(comment_params) 8: binding.pry => 9: if @comment.save 10: flash[:success] = 'コメントを投稿しました。' 11: redirect_to root_url 12: else 13: @comments = current_user.comments.order(id: :asc) 14: flash.now[:danger] = 'コメントの投稿に失敗しました。' 15: render 'topics/show' 16: end 17: end [1] pry(#<CommentsController>)> params => <ActionController::Parameters {"utf8"=>"✓", "authenticity_token"=>"VHMQPFEw==", "comment"=><ActionController::Parameters {"content"=>"comments"} permitted: false>, "commit"=>"投稿する", "controller"=>"comments", "action"=>"create"} permitted: false> [2] pry(#<CommentsController>)> comment_params => <ActionController::Parameters {"content"=>"comments"} permitted: true> [3] pry(#<CommentsController>)> @comment => #<Comment:0x00007f75cc0d8e48 id: nil, content: "comments", user_id: 1, topic_id: nil, created_at: nil, updated_at: nil> [4] pry(#<CommentsController>)> next (0.9ms) BEGIN ↳ app/controllers/comments_controller.rb:9 (0.6ms) ROLLBACK ↳ app/controllers/comments_controller.rb:9 From: /app/controllers/comments_controller.rb:13 CommentsController#create:
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/26 09:45 編集
2020/12/02 13:29
2020/12/26 09:44