前提・実現したいこと
いいね機能を非同期通信で実装したいです。
ruby on railsを使ってユーザーがセットリストを投稿できる機能とそれに対していいねができるような機能を実装しようとしています。投稿に対していいねがついているかついていないかの判別するメソッドをモデルに定義しているのですが、部分テンプレートから読み込もうとするとNo method errorとなってしまいます。
一日中悩み続けております。何卒宜しくおねがいします。
発生している問題・エラーメッセージ
terminal
1ActionView::Template::Error (undefined method `liked_by?' for nil:NilClass): 2 1: - if user_signed_in? 3 2: - if set_list.liked_by?(current_user) 4 3: = link_to event_set_list_likes_path(event, set_list), method: :delete, remote: true do 5 4: .like__box 6 5: .heart__mark__unregistered 7
該当のソースコード
setlistrb
1class SetList < ApplicationRecord 2 belongs_to :event, optional: true 3 belongs_to :user 4 has_many :likes, dependent: :destroy 5 has_many :comments, dependent: :destroy 6 7 validates :artist, :first_song, presence: true 8 validates :artist, uniqueness: true 9 10 def liked_by?(user) 11 likes.where(user_id: user.id).exists? 12 end 13end
試したこと
部分テンプレートからではなくviewに同じ記載をすると上記のようなエラーはでません。
参考にしたサイト
https://qiita.com/naberina/items/c6b5c8d7756cb882fb20
https://qiita.com/fumikao/items/373caa60b77f27f2dbdd
【部分テンプレート】
likehtmlhaml
1- if user_signed_in? 2 - if set_list.liked_by?(current_user) 3 = link_to event_set_list_likes_path(event, set_list), method: :delete, remote: true do 4 .like__box 5 .heart__mark__unregistered 6 ♥ 7 .like__number 8 = set_list.likes.count 9 - else 10 = link_to event_set_list_likes_path(event, set_list), method: :post, remote: true do 11 .like__box 12 .heart__mark__registered 13 ♥ 14 .like__number 15 = set_list.likes.count 16- else 17 .like__box 18 .heart__mark__registered 19 ♥ 20 .like__number 21 = set_list.likes.count
【view】
showhtmlhaml
1.button__box 2 .like__button 3 = render partial: "likes/like", locals: { event: @event, set_list: @set_list } 4 .twitter__box 5 %i.fab.fa-twitter
【controller】
likescontroller
1class LikesController < ApplicationController 2 def create 3 @like = Like.create(set_list_id: params[:set_list_id], user_id: current_user.id) 4 end 5 6 def destroy 7 @like = Like.find_by(user_id: current_user.id, set_list_id: params[:set_list_id]) 8 @like.destroy 9 end 10end
【JavaScript】
createjshaml
1$(".like__button").html("#{escape_javascript(render partial: 'like', locals: { event: @event, set_list: @set_list })}");
destroyjshaml
1$(".like__button").html("#{escape_javascript(render partial: "like", locals: { event: @event, set_list: @set_list })}");
回答1件
あなたの回答
tips
プレビュー