前提・実現したいこと
いいねを非同期通信において、いいねのカウントを正しく表示させたいです。
画像のようにいいねの非同期通信はできているのですが、いいねを押すとカウントがおかしくなり正確ないいね数を表示させることができません。
しかし、いいねのカウントがおかしい
※右側の投稿のいいねを押すと、左側の投稿のいいねが取り消される
※また、いいねの非同期通信は、左側の投稿のみに反映される。
右側の投稿にはいいねの非同期通信は適用されない。リロードすればいいねの更新はされる。
該当のソースコード
ruby:_favorite.html.haml
- if user_signed_in? - if current_user.already_favorited?(post) = link_to post_favorites_path(post), method: :delete, remote: true do = icon('fas', 'thumbs-up') - else = link_to post_favorites_path(post), method: :post, remote: true do = icon('far', 'thumbs-up') = post.favorites.count
post/index.html.haml
.posts-profile-box__favoritesBox .posts-profile-box__favoritesBox__favorite#favorites = render partial: "favorites/favorite", locals: { post: post }
favorites/create.js.erb
$('#favorites').html("<%= j(render partial: 'favorite', locals: { post: @post }) %>");
favorites/destroy.js.erb
$('#favorites').html("<%= j(render partial: 'favorite', locals: { post: @post }) %>");
favorites.controller
class FavoritesController < ApplicationController before_action :snow_post def create @favorite = Favorite.create(user_id: current_user.id, post_id: params[:post_id]) @favorites = Favorite.where(post_id: params[:post_id]) end def destroy @favorite = Favorite.find_by(user_id: current_user.id, post_id: params[:post_id]) @favorite.destroy @favorites = Favorite.where(post_id: params[:post_id]) end private def snow_post @post = Post.find(params[:post_id]) end end
favorite.rb
class Favorite < ApplicationRecord belongs_to :user belongs_to :post validates_uniqueness_of :post_id, scope: :user_id end
post.rb
class Post < ApplicationRecord belongs_to :user attachment :image has_many :favorites, dependent: :destroy has_many :comments with_options presence: true do validates :title validates :body validates :image end end
user.rb
class User < ApplicationRecord # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable validates :name, presence: true, uniqueness: true attachment :profile_image has_many :posts, dependent: :destroy has_many :favorites, dependent: :destroy has_many :comments def already_favorited?(post) self.favorites.exists?(post_id: post.id) end end
試したこと
こちらの記事を参考にいいねの実装を試みています。
https://qiita.com/yuto_1014/items/78d8b52d33a12ec33448
同期通信はできていたので、create.js.erbなどの記述に誤りがあるのかなと思いましたが、特に見当たらず。
そもそもデータベースに登録されない?とも思いましたが、データベースには問題なくいいねのデータが送信されていました。
※いいねボタンを押すとデータが記録され、もう一度押すとデータが削除されるようになっています。
いくつかの記事を参考にさせてもらいましたが、自分では対処できず、お助け願います。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/01 10:33
2020/08/01 10:45 編集
2020/08/01 13:27
2020/08/01 19:48
2020/08/02 11:42