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

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

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

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

Q&A

解決済

1回答

1128閲覧

undefined method `any?' for nil:NilClassのエラー原因がわからない。| rails v5.2

yusei01

総合スコア3

Ruby on Rails 5

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

0グッド

0クリップ

投稿2021/07/05 10:00

railsで、特定の投稿に対してコメントできる機能を実装し、バリデーションの制限を超えると件名のエラーが出てしまい解決方法を見つけられなかったためご教示いただきたいです。
エラー内容は以下の通りです。

NoMethodError in Comments#create Showing /app/app/views/posts/show.html.erb where line #94 raised: undefined method `any?' for nil:NilClass

なお、自分の書いたコードは以下の通りです。

---posts/show.html.erb--- <% if @comments.any? %> <ul class="comment-index"> <% @comments.each do |comment| %> <li class="comment-post"> <!--投稿内容--> <div class="comment-content"> <p> <%= safe_join(comment.content.split("\n"), tag(:br)) %> </p> <!--投稿削除ボタン--> <% if current_user == comment.user %> <div class="comment-delete btn"> <%= link_to 'コメントを削除する', post_comment_path(@post, comment), method: :delete, data: { confirm: '本当に削除してよろしいでしょうか?' } %> </div> <% end %> </div><!--ここまでがcomment-content--> </li> <% end %> </ul><!--ここまでcomment-index--> <% end %>
---comment.rb--- class Comment < ApplicationRecord validates :content, presence: true, length: { maximum: 255 } belongs_to :user belongs_to :post end
---comments_controler.rb--- class CommentsController < ApplicationController def create @post = Post.find(params[:post_id]) @comment = @post.comments.new(comment_params) @comment.user_id = current_user.id if @comment.save flash[:notice] = 'コメントしました。' redirect_to @post else flash[:notice] = 'コメントに失敗しました。' render template: "posts/show" end end
---posts_controller.rb--- class PostsController < ApplicationController def show @post = Post.find(params[:id]) @user = @post.user @comments = @post.comments @comment = Comment.new counts(@post) end end

comment.rbに記載したとおり、Commentsテーブルのcontentカラムには1文字以上255文字以下でしか保存されない旨、validationを設定しました。このvalidationを超えると当エラーが出てしまいます。

原因をつきとめられなかったため、ご教示いただけたら幸いです。
よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

PostsController#showでは@commentsを用意していますが、CommentsController#createからrender template: "posts/show"とする際には@commentsがないので、エラーメッセージの通りnilとなっています。

再表示の際にも@commentsを用意しておくか、あるいは逆に全部@post.commentsで書いて@commentsを不要にするか、をしておきましょう。

投稿2021/07/05 10:05

maisumakun

総合スコア146018

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

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

yusei01

2021/07/05 22:32

ご回答ありがとうございます。 エラー原因理解することができました。 @commentsをすべて@post.commentsに修正することで解決することができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問