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

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

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

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

Ruby on Rails

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

Q&A

0回答

2336閲覧

Railsでのタイムアウト防止のため、クライアントへの定期的な応答方法

RyutaroYamakawa

総合スコア11

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2017/05/01 23:00

##事象
Herokuで行っているajax処理がタイムアウトします。
apiを複数回実行しなくてはいけない処理で、時間がかかってしまいます。
Herokuでは、クライアントに30秒応答がないとタイムアウトしてしまうので、対策として
定期的にクライアント側に応答を返したいのですが、方法がわかりません。
プログレスバーのように、少しづつ応答を返せないか探しています。

##環境
ruby 2.4.0p0
Rails 5.0.2
Heroku

##ソースコード
controllers/topics_controller.rb

controllers/topics_controller.rb

1 def all 2 #ajax元処理 3 @topic_name = 'すべてのトピックの集計' 4 @post_data = Array.new 5 end 6 7def all_post 8 #こっちがajaxで呼ばれる処理 9 #ページ読み込み完了時に処理開始 10 topics = Topic.all 11 access_token = get_access_token 12 @post_data = Array.new 13 14 topics.each do |topic| 15 posts = Post.where(topic: topic) 16 17 posts.each do |post| 18 #apiからデータを取得して、post_jsonに格納する処理があるが省略 19 #配列作成 20 post_data = { 21 "post_id" => post_json['post']['id'], 22 "topic_id" => post_json['post']['topicId'], 23 "name" => post_json['post']['account']['fullName'], 24 "message" => post_json['post']['message'], 25 "like" => post_json['post']['likes'].count, 26 "imageUrl" => post_json['post']['account']['imageUrl'], 27 "created_at" => created_time_to_time.to_s 28 } 29 @post_data.push(post_data) 30 end 31 end 32 # likeの数でソート 33 @post_data = @post_data.sort { |a, b| b['like'] <=> a['like'] } 34 end

views/topics/all.html.erb

views/topics/all.html.erb

1def all_post 2 <div class="row"> 3 <aside class="col-md-12 col-md-4"> 4 <div class="panel panel-default"> 5 <div class="panel-heading"> 6 <h3 class="panel-title"><%= @topic_name %></h3> 7 </div> 8 </div> 9 <p id="time"><%= @time %></p> 10 </aside> 11 <div class="col-md-8 col-xs-12"> 12 <ul class="media-list" id="ajax_list"> 13 <p>読み込み中...</p> 14 </ul> 15 </div> 16</div>

controllerのall_postの処理後に呼ばれるjs
views/topics/all_post.js.erb

var post_data = '<% @post_data.each do |post| %>' + '<% user = post['name'] %>' + '<li class="media">' + '<div class="media-left">' + '<img class="media-object img-rounded" src="<%= post['imageUrl'] %>" alt="" height="50" width="50">' + '</div>' + '<div class="media-body">' + '<div>' + '<p><%= link_to '元サイトで見る', "https://talkapp.in/topics/#{post['topic_id']}/posts/#{post['post_id']}", :target => ["_blank"] %></p>' + '<%= user %>' + '<span class="text-muted">posted at <%= post['created_at'] %></span>' + '</div>' + '<div>' + '<%= simple_format(post['message']) %>' + '</div>' + '<div>' + '<p class="col-xs-2 bg-danger">イイネの数 <%= post['like'] %></p>' + '</div>' + '</div>' + '</li>' + '<% end %>'; $("#ajax_list").html(post_data);

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

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

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

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

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

gouf

2017/05/02 18:19

フロント側での対策の前に、バックエンド側での対応は可能ですか? (返却レコードのページング処理による1回あたりのレスポンス量の削減など)
RyutaroYamakawa

2017/05/03 02:56

バックエンド側の対応も考えましたが、apiで取得したデータ全件をソートする必要があるため、フロントで対応しようと考えています。
RyutaroYamakawa

2017/05/03 02:56

逆にソート処理さえなければ、ページングができます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問