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

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

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

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

Ajax

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

Q&A

0回答

331閲覧

599px以下の画面でのみ、いいねの非同期が反映されない

mbk08

総合スコア0

Ruby on Rails 6

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

Ajax

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

0グッド

0クリップ

投稿2020/10/08 09:26

前提・実現したいこと

いいね機能を非同期で実装しています。
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

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

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

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

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

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

kuma_kuma_

2020/10/12 14:43

<% 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 %> peopleA</div> <% end %> <% else %> <%= link_to event_likes_path(@event.id), method: :post, remote: true do %> <div class = "iine__button">♡️ <%= @event.likes.count %> peopleB</div> <% end %> <% end %> </div> <% else %> <div class="like-link"> <%= @event.likes.count %> peopleC </div> <% end %>
kuma_kuma_

2020/10/12 14:44

上の状態で599px以下のサイズで表示するとどうなるの?
mbk08

2020/10/13 05:24

上記の記述で599px以下のサイズで表示すると、 ・リロードしないと反映されない ・ボタンを押した分だけいいねがカウントされる という状態になります。 599px以上の画面の大きさでは、うまく非同期で反映されています。
kuma_kuma_

2020/10/13 08:15

ちゃんと書いておけばよかったですね。 「people」を「peopleA」「peopleB」「peopleC」と変更したので、どのモードで表示されているか知りたかったのです。 ちなみに「❤️」「♡️」はGood、badはどちらがどっちですか? あと一度 > @media (max-width: 1599px) { にして同じ現象が発生するか確認してみて下さい。
mbk08

2020/10/13 09:25

理解不足で申し訳ございません > < イベント作成した以外のユーザーで、  ログインしている、いいねしている → peopleA  ログインしている、いいねしていない → peopleB イベントを作成したユーザーまたはログインしていないユーザーに対して → peopleC で表示されています。 これは画面サイズが変わっても同じです。 599px以下になった場合のみ、この初期の表示からリロードするまで切り替わりません。 「❤️」はいいねしている状態(good)、「♡」はいいねしていない状態(bad)です。 @media (max-width: 1599px) では正常に反映されていました。
kuma_kuma_

2020/10/13 09:53

> @media (max-width: 1599px) では ・リロードしないと反映されない ・ボタンを押した分だけいいねがカウントされる が発生しなかったという事だよね? そうしたらその状態で画面の幅を狭めていって どの程度の幅でその現象がおきるか確認してみて下さい その現象が起きる場合と起きない場合で画面表示で差があるはずです。 また開発コンソールのログも確認してください。 現象が起きる場合エラーとか発生していませんか? それが終わったら次はこれで試してみて下さい。 > @media screen and (min-width: 599px) {
mbk08

2020/10/13 11:16

検証したところ、600~1599pxまでは非同期でいいね反映されており、 以下のように、ボタンを押すたびに表示が切り替わってる状態です。  いいね押す → ❤️に切り替わる、カウント数が1増える  もう一度押す → ♡に切り替わる、カウント数が1減る ですが、やはり599pxになった瞬間非同期が反映されません。 コンソールを確認しましたがエラーも出ていないです。 599px以下は、レスポンシブルデザインをしているので CSSは変えていますが、HTMLは変えていません。 > @media screen and (min-width: 599px) { 上記にコードを変えたところ、ビューが崩れどの画面の大きさでも非同期が反映されなくなりました。
kuma_kuma_

2020/10/13 11:32

整理しましょう。まず > @media (max-width: 1599px) とした場合 ・ 600~1599pxでは特に問題は発生しない ・ 599pxになった途端動作がおかしくなる。 ・ 動作がおかしくなった際エラーを確認したが特に発生した様子はなかった。 ・ @media screen and (min-width: 599px) に変更したところ 表示全体が崩れた。 もしかしてヘッダーに <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> と書いていますか?
mbk08

2020/10/13 11:55

> @media (max-width: 1599px) この状態ではおっしゃる通りの動作になります。 app > views > layouts > application.html.erb のヘッダーには <meta name="viewport" content="width=device-width, initial-scale=1.0"> と記述しています。
kuma_kuma_

2020/10/13 11:57

すみません一度 <meta name="viewport" content="width=device-width, initial-scale=1.0"> をコメント化して @media screen and (min-width: 599px) をもう一度試してもらえますか?
mbk08

2020/10/14 00:48

<meta name="viewport" content="width=device-width, initial-scale=1.0"> こちらをコメントアウトしても動作は変わりませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問