前提・実現したいこと
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 %>
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/15 11:20