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

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

詳細はこちら
Haml

Haml(HTML abstraction markup language)は、HTML/XHTMLを効率的に記述するためのマークアップ言語および記法です。

Ruby

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

Ruby on Rails

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

Q&A

解決済

2回答

2755閲覧

いいね機能の実装ができない

nasuk47

総合スコア311

Haml

Haml(HTML abstraction markup language)は、HTML/XHTMLを効率的に記述するためのマークアップ言語および記法です。

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2019/11/25 12:05

編集2019/11/25 12:42

前提・実現したいこと 

投稿にいいね機能を実装したいと思い
https://qiita.com/nojinoji/items/2c66499848d882c31ffa
このサイトを参考にコードを書いたのですが
詳細ページにアクセスするとエラーが出る

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

NoMethodError in Comments#show Showing /app/views/comments/show.html.haml where line #15 raised: undefined method `likes' for nil:NilClass

該当のソースコード

routes

1Rails.application.routes.draw do 2 devise_for :users 3 resources :users, only: [:index, :show] 4 # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html 5 root to: 'posts#index' 6 resources :posts, only: [:index] 7 resources :comments, only: [:index, :new, :create, :show, :destory, :edit] do 8 resources :likes, only: [:create, :destroy] 9 end 10end

model

1class User < ApplicationRecord 2 # Include default devise modules. Others available are: 3 # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable 4 devise :database_authenticatable, :registerable, 5 :recoverable, :rememberable, :validatable 6 has_many :user_members 7 has_many :members, through: :user_members 8 has_many :comments, dependent: :destroy 9 has_many :likes, dependent: :destroy 10 has_many :liked_comments, through: :likes, source: :post 11 def alreadey_liked?(comment) 12 self.likes.exists?(comment_id: comment.id) 13 end 14end

model

1class Comment < ApplicationRecord 2 belongs_to :user 3 has_many :likes 4 has_many :liked_users, through: :likes, source: :user 5 has_many :member_comments 6 has_many :member, through: :member_comments 7 8 accepts_nested_attributes_for :member_comments 9end

model

1class Like < ApplicationRecord 2 belongs_to :user_id 3 belongs_to :comment_id 4 validates_uniqueness_of :comment_id, scope: :user_id 5end

controller

1class LikesController < ApplicationController 2 def create 3 @like = current_user.likes.create(comment_id: params[:comment_id]) 4 redirect_to comments_path 5 end 6 7 def destroy 8 @like = Like.find_by(comment_id: params[:comment_id], user_id: current_user.id) 9 @like.destroy 10 redirect_back(fallback_location: root_path) 11 end 12 13end

controller

1class CommentsController < ApplicationController 2 3 before_action :authenticate_user!, only: [:create, :show] 4 5 def index 6 @comments = Comment.all 7 @comment = Comment.new 8 end 9 10 def new 11 @comment = Comment.new 12 @comment.member_comments.build 13 end 14 15 def create 16 # binding.pry 17 @comment = Comment.new(comment_params) 18 @comment.user_id = current_user.id 19 20 if @comment.save 21 redirect_to comments_path 22 else 23 render :new 24 end 25 end 26 27 def show 28 @comment = Comment.find(params[:id]) 29 @like = Like.new 30 31 end 32 33 def update 34 end 35 36 def destory 37 comment = Comment.find(params[:id]) 38 comment.destory 39 end 40 41 private 42 def comment_params 43 params.require(:comment).permit(:place, :text, :image, { :member_ids => [] }) 44 end 45 46end

haml

1.contents 2 .content 3 .content__info 4 .content__left-name 5 - @comment.member.each do |m| 6 = m.name 7 .content__right-place 8 = @comment.place 9 .image 10 = image_tag@comment.image 11 .comments 12 .comment 13 = @comment.text 14 %h3 15 いいね件数: #{@comment.likes.count} 16 - if current_user.already_liked?(@comment) 17 = button_to 'いいねを取り消す', post_like_path(@comment), method: :delete 18 - else 19 = button_to 'いいね', post_likes_path(@comment) 20 %h2 いいねしたユーザー 21 - @comment.liked_users.each do |user| 22 %li= user.name

haml

1.contents 2 - @comments.each do |comment| 3 .content 4 .content__left 5 .content__left--place 6 = comment.place 7 .content__right 8 .content__right-name 9 - comment.member.each do |member| 10 = member.name 11 =link_to '詳細', "comments/#{comment.id}", method: :get

試したこと

{@comment.likes.count}の部分の名前が違っているのかと思い
commentsやlikeにしてみた

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

winterboum

2019/11/25 12:17 編集

エラーがどの行で発生したか、という情報もあったと思います。 その行は @comment = Comment.find(params[:id]) @like = Like.new のどちらですか? それともviewのなか? CommentsControllerのshowを呼ぶviewもミセテ下さい
nasuk47

2019/11/25 12:22

viewのエラーでした。 エラーの内容とviewを追加しました
guest

回答2

0

@commentがnilだと言われてますね。
すると 
@comment = Comment.find(params[:id])
がnilになっている、すなわち実在しない id が渡されている

かと思ったのですが、それだと findは例外になってnilを返すわけではない、、、

エラーの出た画面の下の方に パラメータが表示されていませんか?
なければlogをみて下さい。
そこのidを確認し、そのidのcommentがあるか確認して下さい

追記
@comment = Comment.find(params[:id]) がnilだとすると、viewの上の方にある @comment.XXXたちも同じエラーになるはずがならない。
ということは、それらとの違いは - も = もないこと
hamlはまだやったことがないのですがいいね件数: #{@comment.likes.count}という書き方が許されるのですね?念のために= "いいね件数: #{@comment.likes.count}" で試してみて下さい

投稿2019/11/25 12:24

編集2019/11/25 12:34
winterboum

総合スコア23567

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

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

nasuk47

2019/11/25 12:28

{"_method"=>"get", "authenticity_token"=>"9J7D0wjEILFQd7MFBrYQtqYbeXL2RBnvn85/+vN/DAYAS8cmRzb/TOzsUgRVCQNoUyOSusCI6OCcGQ3gG8/bPA==", "id"=>"1"} これが中身です。idのコメントも確認しました。
nasuk47

2019/11/25 12:41

= "いいね件数: #{@comment.likes.count}" に変更しても同じエラー内容でした
nasuk47

2019/11/25 16:40

回答ありがとうございます。いろいろ模索してみます。
guest

0

自己解決

migrationファイルで書き間違いがあってデータベースに誤って作成していたのが原因でした。

migrate

1class CreateLikes < ActiveRecord::Migration[5.2] 2 def change 3 create_table :likes do |t| 4 t.references :comment, foreign_key: true 5 t.references :member, foreign_key: true 6 7 t.timestamps 8 end 9 end 10end

migrate

1class CreateLikes < ActiveRecord::Migration[5.2] 2 def change 3 create_table :likes do |t| 4 t.references :comment, foreign_key: true 5 t.references :user, foreign_key: true 6 7 t.timestamps 8 end 9 end 10end

投稿2019/11/26 03:47

nasuk47

総合スコア311

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問