質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.47%
Ruby

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

Ruby on Rails

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

Ajax

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

Q&A

解決済

1回答

1023閲覧

[rails][非同期] いいね機能 いいね数の表示が正常にされない

r_tech

総合スコア1

Ruby

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

Ruby on Rails

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

Ajax

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

0グッド

0クリップ

投稿2020/11/15 14:27

前提・実現したいこと

いいねの数を正確に表示させたいです。
Railsでいいね機能をAjaxを用いて非同期で行えるように実装しています。

ユーザーは一つの投稿に対して一つのいいねができます。
まだいいねを押していない投稿に♡を押すと、いいねができ、
すでにいいねをしている投稿に♡を押すと、いいねを削除できます。(twitterの仕様と同じです)

発生している問題・エラーメッセージ

いいねボタンの横にいいね数を表示しているのですが、
いいねを押した時に、正しいいいね数の右横にいいねを押す前の数字が残ったままになり、リロードすると正しい表示になります。
(例)
いいね数0の投稿にいいねを押すと、10と表示される     リロードすると1となる
いいね数1の投稿にいいねを押すと、21と表示される     リロードすると2となる
いいね数2の投稿にいいねを押すと、32と表示される     リロードすると3となる

特にエラー文は出ておらず、ターミナルを見てみても問題ないように見えます。

ターミナルの表示です 前半がいいねボタンを押した時で、後半がリロードした時の動きです [前半] Started POST "/tweets/30/likes" for ::1 at 2020-11-15 22:35:42 +0900 Processing by LikesController#create as JS Parameters: {"tweet_id"=>"30"} User Load (0.3ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 ORDER BY `users`.`id` ASC LIMIT 1 Tweet Load (0.4ms) SELECT `tweets`.* FROM `tweets` WHERE `tweets`.`id` = 30 LIMIT 1 ↳ app/controllers/likes_controller.rb:4:in `create' (0.2ms) BEGIN ↳ app/controllers/likes_controller.rb:6:in `create' Tweet Load (0.3ms) SELECT `tweets`.* FROM `tweets` WHERE `tweets`.`id` = 30 LIMIT 1 ↳ app/controllers/likes_controller.rb:6:in `create' Like Exists? (0.3ms) SELECT 1 AS one FROM `likes` WHERE `likes`.`tweet_id` = 30 AND `likes`.`user_id` = 1 LIMIT 1 ↳ app/controllers/likes_controller.rb:6:in `create' Like Create (1.7ms) INSERT INTO `likes` (`tweet_id`, `user_id`, `created_at`, `updated_at`) VALUES (30, 1, '2020-11-15 13:35:43.112297', '2020-11-15 13:35:43.112297') ↳ app/controllers/likes_controller.rb:6:in `create' (1.8ms) COMMIT ↳ app/controllers/likes_controller.rb:6:in `create' Rendering likes/create.js.erb Like Exists? (0.3ms) SELECT 1 AS one FROM `likes` WHERE `likes`.`user_id` = 1 AND `likes`.`tweet_id` = 30 LIMIT 1 ↳ app/models/user.rb:29:in `already_liked?' (0.3ms) SELECT COUNT(*) FROM `likes` WHERE `likes`.`tweet_id` = 30 ↳ app/views/likes/_like.html.erb:4 Rendered likes/_like.html.erb (Duration: 2.7ms | Allocations: 1707) Rendered likes/create.js.erb (Duration: 3.0ms | Allocations: 1812) Completed 200 OK in 125ms (Views: 2.8ms | ActiveRecord: 5.6ms | Allocations: 9518) [後半] Started GET "/tweets/30" for ::1 at 2020-11-15 22:35:50 +0900 Processing by TweetsController#show as HTML Parameters: {"id"=>"30"} Tweet Load (0.5ms) SELECT `tweets`.* FROM `tweets` WHERE `tweets`.`id` = 30 LIMIT 1 ↳ app/controllers/tweets_controller.rb:58:in `set_tweet' Rendering tweets/show.html.erb within layouts/application User Load (0.4ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 ORDER BY `users`.`id` ASC LIMIT 1 ↳ app/views/shared/_header.html.erb:12 Rendered shared/_header.html.erb (Duration: 4.6ms | Allocations: 1812) User Load (0.4ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 3 LIMIT 1 ↳ app/views/tweets/show.html.erb:15 Like Exists? (0.5ms) SELECT 1 AS one FROM `likes` WHERE `likes`.`user_id` = 1 AND `likes`.`tweet_id` = 30 LIMIT 1 ↳ app/models/user.rb:29:in `already_liked?' (0.6ms) SELECT COUNT(*) FROM `likes` WHERE `likes`.`tweet_id` = 30 ↳ app/views/likes/_like.html.erb:4 Rendered likes/_like.html.erb (Duration: 5.9ms | Allocations: 1788) Comment Load (0.5ms) SELECT `comments`.* FROM `comments` WHERE `comments`.`tweet_id` = 30 ↳ app/views/tweets/show.html.erb:43 Rendered tweets/show.html.erb within layouts/application (Duration: 17.7ms | Allocations: 5637) [Webpacker] Everything's up-to-date. Nothing to do Completed 200 OK in 36ms (Views: 29.1ms | ActiveRecord: 2.9ms | Allocations: 15057)

該当のソースコード

tweet_likes DELETE /tweets/:tweet_id/likes(.:format) likes#destroy tweet_likes POST /tweets/:tweet_id/likes(.:format) likes#create

ruby

1app/controllers/likes_controller.rb 2 3 4class LikesController < ApplicationController 5 6 def create 7 @tweet = Tweet.find(params[:tweet_id]) 8 @like = current_user.likes.build(tweet_id: params[:tweet_id], user_id: current_user.id) 9 @like.save 10 end 11 12 def destroy 13 @tweet = Tweet.find(params[:tweet_id]) 14 @like = Like.find_by(tweet_id: params[:tweet_id], user_id: current_user.id) 15 @like.destroy 16 end 17end

ruby

1app/views/likes/_like_html.erb 2 3<% if user_signed_in? %> 4 <% if current_user.already_liked?(tweet) %> 5 <%= link_to '♡', tweet_likes_path(tweet.id), method: :delete, class:"list-inline-item ml-5", remote: true %> 6 <li class="list-inline-item"><%= tweet.likes.count %></li> 7 <% else %> 8 <%= link_to '♡', tweet_likes_path(tweet.id), method: :post, class:"list-inline-item ml-5", remote: true %> 9 <li class="list-inline-item"><%= tweet.likes.count %></li> 10 <% end %> 11<% else %> 12 ♡<li class="list-inline-item"><%= tweet.likes.count %></li> 13<% end %>

ruby

1app/views/likes/create.js.erb 2 3$('#likes_buttons_<%= @tweet.id %>').html("<%= j(render partial: 'likes/like', locals: {tweet: @tweet}) %>");

ruby

1app/views/likes/destroy.js.erb 2 3$('#likes_buttons_<%= @tweet.id %>').html("<%= j(render partial: 'likes/like', locals: {tweet: @tweet}) %>");

ruby

1app/views/tweets/show.html.erb 2 3<% if user_signed_in? && current_user.id == @tweet.user_id %> 4 <div class="text-right"> 5 <%= link_to '編集', edit_tweet_path, class: "card-link" %> 6 <%= link_to '削除', tweet_path, method: :delete, class: "card-link" %> 7 </div> 8 <% end %> 9 <h3 class="card-title mb-4"><%= @tweet.title %></h3> 10 <p class="card-text"><%= @tweet.text %></p> 11 <ul class="list-inline"> 12 <%= link_to "/users/#{@tweet.user.id}" do %> 13 <li class="list-inline-item"><%= @tweet.user.nickname %></li> 14 <% end %> 15 <li class="list-inline-item ml-2"><%= @tweet.user.age.name %></li> 16 <li class="list-inline-item"><%= @tweet.user.gender.name %></li> 17 <li class="list-inline-item"><%= @tweet.user.occupation.name %></li> 18 <%= link_to "#" do %> 19 <li class="list-inline-item ml-4 mr-5">悩み:<%= @tweet.category.name %></li> <%# 後ほどカテゴリー検索機能 %> 20 <% end %> 21 22 <li id="likes_buttons_<%= @tweet.id %>", class="list-inline-item" > 23 <%= render partial: 'likes/like', locals: {tweet: @tweet} %> 24 </li> 25 26 </ul> 27 28#以下省略 29 30

ruby

1config/routes.rb 2 3Rails.application.routes.draw do 4 devise_for :users 5 devise_scope :user do 6 get '/users/sign_out' => 'devise/sessions#destroy' 7 end 8 9 root to: "tweets#index" 10 resources :tweets, except: :index do 11 resources :comments, only: [:create, :destroy] 12 collection do 13 get 'search' 14 end 15 resource :likes, only: [:create, :destroy] 16 end 17 resources :users, only: :show 18end

JavaScript

1 2app/JavaScript/packs/application.js 3 4require("@rails/ujs").start() 5require("turbolinks").start() 6require("@rails/activestorage").start() 7require("channels") 8require("jquery") 9

試したこと

エラー文がなくどこを確かめてみれば良いかわかりませんでした。
いいね数の表示がおかしいということで、app/views/likes/_like_html.erbの
いいね数を表示する記述などを確かめてみましたが、特に問題があるようには見えませんでした。

リロードしたら正しい表示になるので、非同期を実装する過程で問題が起こっていると思うのですが
私の力不足で解決にいたりませんでした。

同じような質問がないか調べてみましたが見つからず、質問させていただきました。

初めての質問で至らないところがあると思いますが、何卒よろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

Ruby 2.6.5

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

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

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

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

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

guest

回答1

0

ベストアンサー

<li id="likes_buttons_<%= @tweet.id %>", class="list-inline-item" >タグの中に
<li class="list-inline-item">タグが入ってるせいで
ブラウザが勝手に</li>を補完しているかと思います。

投稿2020/11/15 22:24

asm

総合スコア15147

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

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

r_tech

2020/11/16 01:41

おっしゃる通りでした。 重複している<li>タグとclass="list-inline-item"と取り除くことで 正しい表示ができるようになりました。 大変勉強になりました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問