###前提・実現したいこと
ホーム画面で一つ一つの投稿に対していいね機能をつけたいと思っています。具体的にはユーザーがいいねを押すとハートの色が変わり、もう一度押すと色が戻るといったことをajaxの非同期通信を使って行いたいです。
###発生している問題・エラーメッセージ
現在は、画面上でいいねを押すとcreateアクションによってlikesテーブルにレコードが追加されますが、サイト上でリロードを行わない限りハートの色は変わらず、何回でもいいねボタンを押せてしまうといった問題があります。いいね機能自体はリロードを行えばしっかり動くのですが、createアクション(またはdestroyアクション)を行った後にcreate.js.erb(またはdestroy.js.erb)が読み込まれていないことに困っています。
###view/posts/index.html.erb
#全ての投稿に対してeachメソッドを使って取得したpost <%= render partial: "likes/like", locals: { post: post, like: @likes } %>
###view/likes/_like.html.erb
<% if user_signed_in? %> <% if post.like_user(current_user.id) %> <%= button_to post_like_path(like,post_id: post.id), method: :delete, id: "like-button", remote: true do %> <%= image_tag("icon_red_heart.svg") %> <span> <%= post.likes_count %> </span> <% end %> <% else %> <%= button_to post_likes_path(post.id), id: "like-button", remote: true do %> <%= image_tag("icon_heart.svg") %> <span> <%= post.likes_count %> </span> <% end %> <% end %> <% else %> <%= image_tag("icon_heart.svg") %> <span> <%= post.likes_count %> </span> <% end %>
###posts_controller
class PostsController < ApplicationController def index @posts = Post.all.order('created_at DESC') @likes = Like.where(user_id: current_user) end def new end def create Post.create(song_title: post_params[:song_title], singer: post_params[:singer], youtube_url: post_params[:youtube_url], text: post_params[:text], user_id: current_user.id) end def show @post = Post.find(params[:id]) end def destroy post = Post.find(params[:id]) if post.user_id == current_user.id post.destroy end end def edit @post = Post.find(params[:id]) end def update post = Post.find(params[:id]) if post.user_id == current_user.id post.update(post_params) end end private def post_params params.permit(:song_title, :singer, :youtube_url, :text) end end
###likes_controller
class LikesController < ApplicationController before_action :set_post def create Like.create(user_id: current_user.id, post_id: params[:post_id]) @like = Like.where(user_id: current_user) @post.reload end def destroy like = Like.find_by(user_id: current_user.id, post_id: params[:post_id]) like.destroy @likes = Like.where(user_id: current_user) @post.reload end private def set_post @post = Post.find(params[:post_id]) end end
###/view/likes/create.js.erb
$("#like-buttons").html("<%= j(render partial: 'likes/like', locals: { posts: @posts, likes: @likes, like: @like}) %>")
###view/likes/destroy.js.erb
$("#like-buttons").html("<%= j(render partial: 'likes/like', locals: { posts: @posts, likes: @likes }) %>");
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。