前提・実現したいこと
いいね機能を実装したくて、
この記事を参考に
いいね機能を実装しました
このアプリのgithub
発生している問題・エラーメッセージ
いいねボタンを押した時、いいねは上手く行くのですが、いいねの解除が上手くいきません
rails serverのログでは
Started DELETE "/like/19" for ::1 at 2020-12-23 16:56:49 +0900 Processing by LikesController#unlike as JS Parameters: {"drink_id"=>"19"} Drink Load (0.5ms) SELECT `drinks`.* FROM `drinks` WHERE `drinks`.`id` = 19 LIMIT 1 ↳ app/controllers/likes_controller.rb:21:in `set_variables' User Load (0.4ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 6 LIMIT 1 ↳ app/helpers/sessions_helper.rb:53:in `current_user' Like Load (0.3ms) SELECT `likes`.* FROM `likes` WHERE `likes`.`user_id` = 6 AND `likes`.`drink_id` = 19 LIMIT 1 ↳ app/controllers/likes_controller.rb:14:in `unlike' Rendering likes/unlike.js.erb CACHE Like Load (0.0ms) SELECT `likes`.* FROM `likes` WHERE `likes`.`user_id` = 6 AND `likes`.`drink_id` = 19 LIMIT 1 ↳ app/views/likes/_like.html.erb:2 (0.3ms) SELECT COUNT(*) FROM `likes` WHERE `likes`.`drink_id` = 19 ↳ app/views/likes/_like.html.erb:4 Rendered likes/_like.html.erb (Duration: 3.2ms | Allocations: 1654) Rendered likes/unlike.js.erb (Duration: 3.5ms | Allocations: 1762) Completed 200 OK in 11ms (Views: 4.1ms | ActiveRecord: 1.5ms | Allocations: 4365)
しっかり、いいねを取り消すunlikeメソッドが反応してます
コンソール上ではエラーは確認されてません
きっとレンダリングが上手く行ってない可能性が高いと思います
該当のソースコード
drinks/index.erb
ruby
1 <% @drinks.each do |drink|%> 2 <li class='list'> 3 <%= link_to drink_path(drink.id) do %> 4 <%= link_to user_path(drink.user.id) do%> 5 <div class="user-info-timeline"> 6 <%=image_tag drink.user.image.variant(resize: '60x60'),class: "user-img-timeline" if drink.user.image.attached?%> 7 <div class="username-timeline"> 8 <%= drink.user.nickname %> 9 </div> 10 </div> 11 <% end %> 12 <div class='item-img-content'> 13 <%= image_tag drink.image , class: "item-img" if drink.image.attached? %> 14 15 <%# if drink.trade%> 16 17 18 19 <%# end %> 20 </div> 21 <div class='item-info'> 22 <h3 class='item-name'> 23 <%= drink.name %> 24 </h3> 25 <div class='item-price'> 26 <span><%= drink.price %>円<br>(税込み)</span> 27 <div class='star-btn'> 28 <%# image_tag "star.png", class:"star-icon" %> 29 <span class='star-count'>0</span> 30 </div> 31 </div> 32 <div class='item-explain'> 33 <%= drink.explain%> 34 </div> 35 <div class='item-tag'> 36 <% drink.tags.each do |tag| %> 37 #<%=tag.tag_name%> 38 <%end%> 39 </div> 40 <%= render partial: "likes/like",locals:{drink: drink}%> 41 </div> 42 43 <% end %>
likes/_like.html.erb
ruby
1<div class="like" id="like-link-<%= drink.id %>"> 2 <% if current_user.likes.find_by(drink_id: drink.id) %> 3 <%= link_to unlike_path(drink.id), method: :delete, remote: true do %> 4 <div class = "iine__button">❤️<%= drink.likes.count %></div> 5 <% end %> 6 <% else %> 7 <%= link_to like_path(drink.id), method: :post, remote: true do %> 8 <div class = "iine__button">♡️<%= drink.likes.count %></div> 9 <% end %> 10 <% end %> 11</div> 12
likes/like.js.erb
erb
1$("<%= @id_name %>").html('<%= escape_javascript(render("likes/like", drink: @drink )) %>');
likes/unlike.js.erb
erb
1$("<%= @id_name %>").html('<%= escape_javascript(render("likes/like", drink: @drink )) %>');
こっちが上手くいかない。
like_controller
ruby
1class LikesController < ApplicationController 2 include SessionsHelper 3 4 before_action :set_variables 5 def like 6 7 like = current_user.likes.new(drink_id: @drink.id) 8 #redirect_to drinks_path 9 # jsを用いるので画面遷移は行わない 10 binding.pry 11 like.save 12 end 13 14 def unlike 15 like = current_user.likes.find_by(drink_id: @drink.id) 16 binding.pry 17 like.destroy 18 end 19 20 private 21 22 def set_variables 23 @drink = Drink.find(params[:drink_id]) 24 @id_name = "#like-link-#{@drink.id}" 25 end 26 27end 28
routes.rb
ruby
1Rails.application.routes.draw do 2 root to: 'drinks#index' 3 get '/login', to: 'sessions#new' 4 post '/login', to: 'sessions#create' 5 delete '/logout', to: 'sessions#destroy' 6 get 'user/likes', to: 'users#likes' 7 resources :users do 8 member do 9 get :following,:followers 10 # memberメソッドを使うと 11 # ユーザーidが含まれてるURlを扱うようになる 12 end 13 end 14 get '/drinks/searchdrink', to: 'drinks#search_drink' 15 resources :drinks, only: [:index,:new,:show,:create,:destroy] do 16 collection do 17 get 'search' 18 end 19 20 resources :comments,only: :create 21 # あるツイートに対してのコメントと言う 22 # 親子関係を表現したパスが、コメント投稿に必要なリクエストの 23 # パスになります 24 25 resources :trades,only: [:index,:new,:create] 26 end 27 post '/drinks/:id/trades/new', to: 'trades#create' 28 resources :relationships, only: [:create,:destroy] 29 post 'like/:drink_id' ,to: 'likes#like', as: 'like' 30 delete 'like/:drink_id',to: 'likes#unlike', as: 'unlike' 31end 32
試したこと
とあったので、drinkの部分を@drinkに全部
erb
1$(<%= @id_name %>).html('<%= escape_javascript(render("likes/like" ,locals: {drink: @drink})) %>');
に元々
erb
1$("<%= @id_name %>").html('<%= escape_javascript(render("likes/like" ,locals: {drink: @drink})) %>');
このように
ダブルクォーテーションを入れてたのですが、
likes_contorollerで
@id_name = "#like-link-#{@drink.id}"
と定義してたので、ダブルクォーテーションを外しても結果は変わりませんでした
また、binding.pry(デバッガーツール)で
likes_contorollerのiike,unlikeアクションはしっかり反応して、処理を止めてくれて、変数の中身にしっかり値が入ってくれました。
御回答いただければ幸いです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。