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

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

詳細はこちら
Ruby

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

Ruby on Rails

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

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

1回答

1870閲覧

ruby on rails で画像が2枚以上投稿されてしまうバグ

makao1987

総合スコア4

Ruby

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

Ruby on Rails

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

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2019/10/23 15:39

編集2019/10/23 15:42

前提・実現したいこと chat-spaceというアプリの自動更新で画像が二枚投稿されてしまうバグを直したい

ここに質問の内容を詳しく書いてください。

初めての投稿です。よろしくお願いします。
chat-spaceというテキストと画像を投稿できるラインのようなアプリをエンジニアスクールの
課題で作っております。
使用言語はruby,ruby on rails,JavaScript(JQuery),
haml,scss,mysql、AWSです。

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

JQweyで自動更新機能、インクリメンタルサーチ、非同期通信を実装してます。
今回のエラーは画像を投稿すると同じ写真が2枚もしくは3枚投稿されてしまうことです。
一枚だけちゃんと投稿される時もあり、少ない頻度で2枚以上投稿されてしまいます。

エラーメッセージ ありません。

該当のソースコード

app/assets/javascripts/message.js $(function(){ function buildHTML(message){ var content = message.content ? `${ message.content }` : ""; var imge = message.image ? `<img src= "${ message.image }">` : ""; var html = `<div class="message" data-message-id="${message.id}"> <div class="upper-message"> <div class="upper-message__user-name"> ${message.user_name} </div> <div class="upper-message__date"> ${message.date} </div> </div> <div class = "lower-message"> <p class="lower-message__content"> ${content} </p> </div> ${imge} </div>` return html; } $('#new_message').on('submit', function(e){ e.preventDefault(); var formData = new FormData(this); var url = $(this).attr('action') $.ajax({ url: url, type: "POST", data: formData, dataType: 'json', processData: false, contentType: false }) .done(function(data){ var html = buildHTML(data); $('.messages').append(html); $('.messages').animate({scrollTop: $('.messages')[0].scrollHeight}, 'fast'); $('form')[0].reset(); }) .fail(function(){ alert('error'); }); return false; }); var reloadMessages = function () { if (window.location.href.match(//groups/\d+/messages/)){ var last_message_id = $('.message:last').data("message-id"); $.ajax({ url: "api/messages", type: 'get', dataType: 'json', data: {id: last_message_id} }) .done(function(messages){ messages.forEach(function (message) { var insertHTML = buildHTML(message); $('.messages').append(insertHTML); $('.messages').animate({scrollTop: $('.messages')[0].scrollHeight}, 'fast'); }) }) .fail(function () { alert('自動更新に失敗しました'); }); } }; setInterval(reloadMessages, 10000); }); app/views/messages/create.json.jbuilder json.id @message.id json.user_name @message.user.name json.date @message.created_at.strftime("%Y年%m月%d日 %H時%M分") json.content @message.content json.image @message.image.url app/views/api/messages/index.json.jbuilder json.array! @messages do |message| json.content message.content json.image message.image.url json.date message.created_at.strftime("%Y/%m/%d %H:%M") json.user_name message.user.name json.id message.id end

試したこと

画像を一枚投稿したいのに2枚以上投稿されてしまう。バグです。
エラーメッセージや、検証でコンソールを確認してもエラーはでません。
同じ画像が投稿されてしまうのですが、日付の表記が違うことから、
app/views/messages/create.json.jbuilderから投稿されている画像と
app/views/api/messages/index.json.jbuilderから投稿されている画像と判断できます。

自動更新機能と投稿した瞬間が被ってしまい、複数投稿されてしまうバグが発生しているのだと考えています。
対策としてsetInterval(reloadMessages, 10000);の数値を増やして、自動更新の頻度をへらしてみたりしたのですが、完全になくすができません。
協力お願いします。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

turbolinksの影響が考えられるので、$(function(){$(document).on('turbolinks:load', function() {に変更してはどうでしょうか?

投稿2019/10/23 23:11

no1knows

総合スコア3365

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

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

makao1987

2019/10/24 02:56

回答ありがとうございます。 試してみます!
makao1987

2019/10/24 03:22

試してみましたが、非同期通信が発動しなくなってしまいました。原因を探しているところです。
no1knows

2019/10/24 04:41

見落としていました。setintervalを利用した場合、turbolinksがうまく動かないようです。 解決策の1つに下記があるようです。 https://github.com/turbolinks/turbolinks/issues/448 turbolinksは条件さえあえば非常に強力なツールなのですが、あわないor必要のない場合はOFFにすることも検討してみてください。
makao1987

2019/10/24 04:51

回答ありがとうございます。記事をよくよんで試してみます。JSのことをよくわかっていないので時間がかかると思いますが、やってみます!!ありがとうございます
makao1987

2019/10/24 08:32

度々ありがとうございます。参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問