🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

1回答

1905閲覧

いいねの解除ができない

divclass123

総合スコア35

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2020/12/22 13:02

編集2020/12/23 11:05

前提・実現したいこと

いいね機能を実装したくて、
この記事を参考に
いいね機能を実装しました

このアプリの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アクションはしっかり反応して、処理を止めてくれて、変数の中身にしっかり値が入ってくれました。

 御回答いただければ幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

投稿2020/12/23 14:48

divclass123

総合スコア35

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問