前提・実現したいこと
いいね機能を非同期で実装しています。
599px以上の画面サイズでは非同期で正常に反映されるのですが、
599pxより小さな画面サイズにすると、リロードしないと反映がされません。
また、リロードするまでいいねボタンを押した数だけ、いいね数がカウントされてしまいます。
すべての画面ではなく、599pxより小さな画面のみ実装ができない理由がわかりません。
原因と解決方法を教えていただけると幸いです。
発生している問題・エラーメッセージ
エラーメッセージ
該当のソースコード
controller
1class LikesController < ApplicationController 2 before_action :set_event 3 4 5 def create 6 like = current_user.likes.build(event_id: params[:event_id]) 7 like.save 8 end 9 10 def destroy 11 like = Like.find_by(event_id: params[:event_id], user_id: current_user.id) 12 like.destroy 13 end 14 15 16 private 17 18 def set_event 19 @event = Event.find(params[:event_id]) 20 @id_name = "#like-link-#{@event.id}" 21 end 22 23end
view
1<div class="event-category"> 2 3 <%= render "shared/sidebar"%> 4 5 <div class= "language-img"> 6 <div class= "main-events"> 7 <% @events.where("purpose_id = 1").each do |event| %> 8 <% @event = event %> 9 <ul class= "events-list"> 10 <li class= "lists"> 11 <%=link_to event_path(event.id) do %> 12 <div class= "list-name"> 13 <%= event.name %> 14 </div> 15 <div class= "list-time"> 16 <%= event.month.name %> <%= event.day.name %>th <%= event.year.name %> 17 </div> 18 <% end %> 19 <div class="like"> 20 <%=render partial: "likes/like", event: event %> 21 </div> 22 </li> 23 </ul> 24 <% end %> 25 </div> 26 <div class= "category-name">LANGUAGE</div> 27 </div> 28 29 30 <div class= "main-hide"> 31 <div class= "main-events"> 32 <% @events.where("purpose_id = 1").each do |event| %> 33 <% @event = event %> 34 <ul class= "events-list"> 35 <li class= "lists"> 36 <%=link_to event_path(event.id) do %> 37 <div class= "list-name"> 38 <%= event.name %> 39 </div> 40 <div class= "list-time"> 41 <%= event.month.name %> <%= event.day.name %>th <%= event.year.name %> 42 </div> 43 <% end %> 44 <div class="like"> 45 <%=render partial: "likes/like", event: event %> 46 </div> 47 </li> 48 </ul> 49 <% end %> 50 </div> 51 <div class= "category-name">LANGUAGE</div> 52 </div> 53</div> 54 55<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<% if user_signed_in? && @event.user_id != current_user.id %> <div class="like-link" id="like-link-<%= @event.id %>"> <% if current_user.likes.find_by(event_id: @event.id) %> <%= link_to event_likes_path(@event.id), method: :delete, remote: true do %> <div class = "iine__button">❤️ <%= @event.likes.count %> people</div> <% end %> <% else %> <%= link_to event_likes_path(@event.id), method: :post, remote: true do %> <div class = "iine__button">♡️ <%= @event.likes.count %> people</div> <% end %> <% end %> </div> <% else %> <div class="like-link"> <%= @event.likes.count %> people </div> <% end %>
model
1class Event < ApplicationRecord 2 extend ActiveHash::Associations::ActiveRecordExtensions 3 belongs_to_active_hash :purpose 4 belongs_to_active_hash :year 5 belongs_to_active_hash :month 6 belongs_to_active_hash :day 7 belongs_to_active_hash :day_of_week 8 belongs_to_active_hash :event_time 9 10 belongs_to :user 11 has_many :likes, dependent: :destroy 12 has_one_attached :image 13 14 15 def liked_by?(user) 16 likes.where(user_id: user.id).exists? 17 end 18 19 20 with_options presence: true do 21 validates :name, :place, :info, :image 22 validates :purpose_id, :year_id, :month_id, :day_id, :day_of_week_id, :event_time_id, numericality: { other_than: 0 } 23 end 24end
create
1$("<%= @id_name %>").html('<%= escape_javascript(render("likes/like", event: @event )) %>');
destroy
1$("<%= @id_name %>").html('<%= escape_javascript(render("likes/like", event: @event )) %>');
試したこと
コンソールやターミナルでエラーが出ていないか確かめましたが、特にありませんでした。
この記述だけでなく「いいね 非同期 実装」で検索し、記述を変えて実装してみましたが、結果は同じでした。
ちなみに、599px以下のレスポンシブルデザインのみしています。
.event-category{ width: 100vw; background-color: rgba(236, 233, 233, 0.603); display: flex; position: relative; } .language-img { height: 100vh; width: 100vw; background-image: url(https://cdn.pixabay.com/photo/2017/07/31/11/21/people-2557396_1280.jpg); background-size: cover; background-repeat: no-repeat; background-position: right; padding-left: 80px; } .culture-img { height: 100vh; width: 100vw; background-image: url(https://cdn.pixabay.com/photo/2019/02/04/00/32/festival-3973776_1280.jpg); background-size: cover; background-repeat: no-repeat; background-position: right; padding-left: 80px; } .hangout-img { height: 100vh; width: 100vw; background-image: url(https://cdn.pixabay.com/photo/2016/02/18/22/18/picnic-1208229_1280.jpg); background-size: cover; background-repeat: no-repeat; background-position: right; padding-left: 80px; } .others-img { height: 100vh; width: 100vw; background-image: url(https://cdn.pixabay.com/photo/2015/04/24/01/19/young-people-737150_1280.jpg); background-size: cover; background-repeat: no-repeat; background-position: right; padding-left: 80px; } .main-events { height: 70vh; width: 65vw; margin-top: 150px; font-weight: bolder; font-family: fantasy; display: flex; overflow: scroll; flex-flow: row wrap; } .events-list { margin: 7px; height: 180px; width: 290px; } .lists { background: rgba(255, 255, 255, 0.76); height: 160px; width: 280px; box-shadow: 8px 8px 3px #666666cb; overflow: scroll; } .lists:hover { color: white; background: #69c3faa1; } .list-name { font-size: 25px; padding: 20px 0 0 20px; } .list-time { font-size: 20px; text-align: right; padding-right: 10px; } .like { display: flex; justify-content: space-around; margin-top: 25px; } .like-link { font-size: 18px; } .iine__button { size: 10px; } .category-name { position: absolute; color: rgba(252, 248, 248, 0.89); font-size: 70px; font-weight: bolder; font-family: cursive; bottom: 5px; right: 30px; } .main-hide { display: none; } @media (max-width: 599px) { .event-category { height: 100vh; width: 100vw; background-image: url(https://cdn.pixabay.com/photo/2016/03/09/15/13/road-trip-1246530_1280.jpg); background-size: cover; background-repeat: no-repeat; background-position: center; } .language-img { display: none; } .culture-img { display: none; } .hangout-img { display: none; } .others-img { display: none; } .main-hide { display: block; } .main-events { height: 70vh; width: 45vw; margin-top: 150px; overflow: scroll; } .events-list { margin: 0; } .lists { background-color: rgba(255, 255, 255, 0.623); height: 130px; width: 43vw; } .list-name { font-size: 20px; padding: 10px 0 0 20px; } .list-time { font-size: 17px; text-align: right; padding-right: 10px; } .like { display: flex; justify-content: space-around; margin-top: 20px; } .category-name { font-size: 6vh; right: 20px; } }
補足情報(FW/ツールのバージョンなど)
rails 6.0.0
ruby 2.6.5
あなたの回答
tips
プレビュー