##事象
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);
あなたの回答
tips
プレビュー