前提・実現したいこと
現在画像投稿機能のついたSNSを作っており、投稿詳細画面で一つ一つの投稿に対していいね機能をつけようと思っています。具体的には、ajaxの非同期通信を使って、ユーザーがいいねを押すとハートの色が変わり、もう一度押すと色が戻るようにしたいです。
下記のサイトを参考にしました。
リンク内容
発生している問題・エラーメッセージ
いいねを押すとcreateアクションによってfavoritesテーブルにレコードが追加されますが、サイト上で手動でリロードを行わない限りハートの色は変わらない状態です。いいね機能自体はリロードを行えばしっかり動くのですが、エラーは出ないのですが、create.js.erb(またはdestroy.js.erb)がうまく作動せず困っています。
以下いいねボタンを押したときのターミナルです。
Started POST "/posts/5/favorites" for 127.0.0.1 at 2019-02-12 21:18:21 +0900 Processing by FavoritesController#create as JS Parameters: {"authenticity_token"=>"bU4W35RhgQlQGdP/ganSnkbyvDbH6xlwBOvo3dnCI8Q//BP14aJbfZXNNGVZXLamrCtMcz6s7DLgfdU8yxEoIA==", "post_id"=>"5"} User Load (2.0ms) SELECT "users".* FROM "users" WHERE "users"."id" IS NULL LIMIT ? [["LIMIT", 1]] ↳ app/controllers/application_controller.rb:13 User Load (0.4ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ? [["id", 3], ["LIMIT", 1]] ↳ /Users/kw/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/activerecord-5.2.2/lib/active_record/log_subscriber.rb:98 Post Load (0.2ms) SELECT "posts".* FROM "posts" WHERE "posts"."id" = ? ORDER BY "posts"."created_at" DESC LIMIT ? [["id", 5], ["LIMIT", 1]] ↳ app/controllers/favorites_controller.rb:27 Favorite Load (0.2ms) SELECT "favorites".* FROM "favorites" WHERE "favorites"."user_id" = ? AND "favorites"."post_id" = ? LIMIT ? [["user_id", 3], ["post_id", 5], ["LIMIT", 1]] ↳ app/controllers/favorites_controller.rb:6 Post Load (0.3ms) SELECT "posts".* FROM "posts" WHERE "posts"."id" = ? LIMIT ? [["id", 5], ["LIMIT", 1]] ↳ app/controllers/favorites_controller.rb:11 Rendering favorites/create.js.erb Favorite Load (0.2ms) SELECT "favorites".* FROM "favorites" WHERE "favorites"."post_id" = ? AND "favorites"."user_id" = ? LIMIT ? [["post_id", 5], ["user_id", 3], ["LIMIT", 1]] ↳ app/models/post.rb:10 Favorite Load (0.2ms) SELECT "favorites".* FROM "favorites" WHERE "favorites"."post_id" = ? [["post_id", 5]] ↳ app/views/favorites/_favorite_form.html.erb:3 Rendered favorites/_favorite_form.html.erb (4.4ms) Rendered favorites/create.js.erb (31.0ms) Completed 200 OK in 106ms (Views: 66.8ms | ActiveRecord: 5.2ms)
###該当のコード
post.rb
class Post < ApplicationRecord belongs_to :user has_many :favorites, dependent: :destroy has_many :users, through: :favorites def like_user(user_id) favorites.find_by(user_id: user_id) end end
favorites_controller.rb
class FavoritesController < ApplicationController before_action :authenticate_user! before_action :set_post def create @favorite = Favorite.find_or_create_by( user_id: current_user.id, post_id: params[:post_id] ) @favorites = Favorite.where(post_id: params[:post_id]) @post.reload 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]) @post.reload end private def set_post @post = Post.find(params[:post_id]) end end
favorite.rb
class Favorite < ApplicationRecord belongs_to :user belongs_to :post, counter_cache: :likes_count end
posts/show.html.erb
: :省略 : <div id="likes_buttons_<%= @post.id %>" > <%= render partial: 'favorites/favorite_form', locals: { post: @post } %> </div>
favorites/_favorite_form.html.erb
<% if user_signed_in? %> <% unless @post.like_user(current_user.id).blank? %> <%= button_to post_favorite_path(post_id: @post.id, id: @post.favorites[0].id), method: :delete, id: "like-button", remote: true do %> <span class="fa fa-heart like-btn-unlike"></span> <span> <%= @post.likes_count %> </span> <% end %> <% else %> <%= button_to post_favorites_path(@post), method: :post, id: "like-button", remote: true do %> <span class="fa fa-heart like-btn"></span> <span> <%= @post.likes_count %> </span> <% end %> <% end %> <% else %> <span class="fa fa-heart like-btn"></span> <span> <%= post.likes_count %> </span> <% end %>
favorites/create.js.erb
$("#like-buttons_<%= @post.id %>").html("<%= j(render partial: 'favorite_form', locals: { posts: @posts }) %>");
favorites/destroy.js.erb
$("#like-buttons_<%= @post.id %>").html("<%= j(render partial: 'favorite_form', locals: { posts: @posts }) %>");
試したこと
teratailで似た質問を参考にして見たのですがうまくいきませんでした。
リンク内容
リンク内容
補足情報(FW/ツールのバージョンなど)
Ruby 2.5.0
Rails 5.2.2
ログイン機構はdeviseを使用しています。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。