🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

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

Ruby on Rails

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

Q&A

解決済

1回答

972閲覧

テスト環境 コメント実装 NoMethodError in PostsController#show

YukiTani

総合スコア19

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2021/01/19 13:25

編集2021/01/19 14:09

前提・実現したいこと

画像投稿のサイトを作成しています。
投稿ページにコメントができるように実装しています。
実装しているなかで、NoMethodErrorが発生してしました。

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

イメージ説明

NoMethodError in PostsController#show undefined method `comments' for #<Post:0x00007fe2f8d05a38> Did you mean? committed!

該当のソースコード

rails

1Postコントローラー 2 3class PostsController < ApplicationController 4 before_action :set_post, only: [:show, :edit, :update, :destroy] 5 before_action :authenticate_user!, except: [:index, :show] 6 before_action :move_to_index, only: [:edit, :update, :destroy] 7 8 def index 9 @posts = Post.includes(:user).order("created_at DESC") 10 end 11 12 def new 13 @post = Post.new 14 end 15 16 def create 17 @post = Post.new(post_params) 18 if @post.save 19 redirect_to root_path 20 else 21 render :new 22 end 23 end 24 25 def show 26 @comment = Comment.new 27 @comments = @post.comments ←ここでエラーになっています。 28 end 29 30 def edit 31 end 32 33 def update 34 if @post.update(post_params) 35 redirect_to post_path 36 else 37 render :edit 38 end 39 end 40 41 def destroy 42 @post.destroy 43 redirect_to root_path 44 end 45 46 private 47 48 def post_params 49 params.require(:post).permit(:title, :catch_copy, :concept, :image).merge(user_id: current_user.id) 50 end 51 52 def set_post 53 @post = Post.find(params[:id]) 54 end 55 56 def move_to_index 57 redirect_to root_path unless current_user == @post.user 58 end 59 60end

rails

1ルーティング 2 3Rails.application.routes.draw do 4 devise_for :users 5 root to: 'posts#index' 6 resources :posts, only: [:new, :create, :show, :edit, :update, :destroy] do 7 resources :comments, only: :create 8 end 9 resources :users, only: [:index, :show, :edit, :update, :destroy] 10end

rails

1class Prototype < ApplicationRecord 2 belongs_to :user 3 has_one_attached :image 4 has_many :comments, dependent: :destroy ←ここが抜けていました。 dependent: :destroyも一緒に追記 5 6 validates :title, presence: true 7 validates :catch_copy, presence: true 8 validates :concept, presence: true 9 validates :image, presence: true 10end

試したこと

発生しているエラーは「NoMethodError」で、undefined method`comments' というメソッドが定義されていないといことなので、@commentsという変数が定義されていないのでエラーということはわかりましたが、before_action_set_postで @post = Post.find(params[:id])をわたせるようになっています。原因追求に困っております。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Post(@post) に comments というメソッドがないのでエラーになっています。
class Post を見ると、 has_many :comments の記述がありません。

ruby

1class Post < ApplicationRecord 2 has_many :comments

こうすることでcommentsメソッドが定義されます。

投稿2021/01/19 13:54

neko_daisuki

総合スコア2090

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

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

YukiTani

2021/01/19 14:10

早々のコメントありがとうございました。 表示させることができました。アソシエーションの大切さを改めて感じさせられました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問