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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

505閲覧

Ruby on Rails チュートリアルにコメント機能を加えたい。undefined method `coments'が出て解決できない

nyanmarun

総合スコア4

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2020/07/15 08:56

前提・実現したいこと

Ruby on Rails チュートリアルにコメント機能を加えようとしています。
マイクロポスト機能をつけるときと同じように進めているのですが、途中でエラーが発生してしまい、その原因が何なのか解決できない状態です。

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

NoMethodError in ComentsController#create undefined method `coments' for #<Micropost::ActiveRecord_Associations_CollectionProxy:0x00007f53c804c7c0>

イメージ説明

該当のソースコード

controllers/coments_controller.rb

Ruby

1class ComentsController < ApplicationController 2 before_action :logged_in_user, only: [:create, :destroy] 3 4 def create 5 @micropost = current_user.microposts 6 @coment = @micropost.coments.build(coment_params) 7 if @coment.save 8 flash[:success] = "コメントしました" 9 redirect_to micropost_path(@micropost) 10 else 11 render micropost_path(@micropost) 12 end 13 end 14 15 def destroy 16 end 17 18 private 19 20 def coment_params 21 params.require(:coment).permit(:content) 22 end 23end

関連するソースコード

controllers/microposts_controller.rb

Ruby

1class MicropostsController < ApplicationController 2 before_action :logged_in_user, only: [:create, :destroy] 3 before_action :correct_user, only: :destroy 4 5 def show 6 @micropost = Micropost.find(params[:id]) 7 @coment = @micropost.coments.build if logged_in? 8 @coments = @micropost.coments.paginate(page: params[:page]) 9 end 10 11 def create 12 @micropost = current_user.microposts.build(micropost_params) 13 if @micropost.save 14 flash[:success] = "つぶやきました" 15 redirect_to root_url 16 else 17 @feed_items = [] 18 render 'static_pages/home' 19 end 20 end 21 22 def destroy 23 @micropost.destroy 24 flash[:success] = "つぶやきを削除しました" 25 redirect_to request.referrer || root_url 26 end 27 28 private 29 30 def micropost_params 31 params.require(:micropost).permit(:content, :picture) 32 end 33 34 def correct_user 35 @micropost = current_user.microposts.find_by(id: params[:id]) 36 redirect_to root_url if @micropost.nil? 37 end 38end

関連するソースコード

models/micropost.rb

Ruby

1class Micropost < ApplicationRecord 2 belongs_to :user 3 default_scope -> { order(created_at: :desc) } 4 mount_uploader :picture, PictureUploader 5 validates :user_id, presence: true 6 validates :content, presence: true, length: { maximum: 140 } 7 validate :picture_size 8 9 has_many :coments, dependent: :destroy 10 private 11 12 # アップロードされた画像のサイズをバリデーションする 13 def picture_size 14 if picture.size > 1.megabytes 15 errors.add(:picture, "1MBを超えるファイルは載せられません") 16 end 17 end 18end

関連するソースコード

models/coment.rb

Ruby

1class Coment < ApplicationRecord 2 belongs_to :micropost 3 default_scope -> { order(created_at: :desc) } 4 validates :micropost_id, presence: true 5 validates :content, presence: true, length: { maximum: 140 } 6end

関連するソースコード

views/microposts/show.html.erb

Ruby

1<% provide(:title, "つぶやき") %> 2<h1>つぶやき</h1> 3<%= render @micropost %> 4<div class="col-md-8"> 5 <% if @micropost.coments.any? %> 6 <h3>coments (<%= @micropost.coments.count %>)</h3> 7 <ol class="microposts"> 8 <%= render @coments %> 9 </ol> 10 <%= will_paginate @coments %> 11 <% end %> 12</div> 13<% if logged_in? %> 14 <div class="row"> 15 <aside class="col-md-4"> 16 <section class="coment_form"> 17 <%= render 'shared/coment_form' %> 18 </section> 19 </aside> 20 </div> 21<% else %> 22<% end %>

関連するソースコード

views/shared/coment_form.html.erb

Ruby

1<%= form_for(@coment) do |f| %> 2 <%= render 'shared/error_messages', object: f.object %> 3 <div class="field"> 4 <%= f.text_area :content, placeholder: "ここにコメントしていってくださいな" %> 5 </div> 6 <%= f.submit "コメント", class: "btn btn-primary" %> 7 <span class="picture"> 8 <%= f.file_field :picture, accept: 'image/jpeg,image/gif,image/png' %> 9 </span> 10<% end %>

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

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

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

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

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

guest

回答1

0

ベストアンサー

ruby

1 @micropost = current_user.microposts 2 @coment = @micropost.coments.build(coment_params)

エラーメッセージのとおりです。@micropostは、名前に反してcurrent_user.micropostsという集合が入っています。集合に対してコメントをぶら下げることはできません(特定のMicropostに対して行う必要があります)。

投稿2020/07/15 09:01

maisumakun

総合スコア145183

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

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

nyanmarun

2020/07/15 11:20

回答していただきありがとうございます! @micropost = Micropost.where(user_id: current_user.id) とし、特定のMicropostを指定し直しました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問