QA@IT

RailsでJSのレスポンスが途中で途切れてしまうときの対処方法を知りたい

3478 PV

kaminariを使ったページネーションと画面スクロールによるコンテンツ追加読み込みを組み合わせて無限スクロール機能を実装しているのですが、ローカルの環境では動くのに本番環境(またはそれに近い構成の環境)で正しく動かないという現象が起きています。

追加読み込みの際に戻ってくるJSのレスポンスが途中で途切れているため、JSのコードが想定通りに実行されないという問題です。そのために追加のコンテンツが読み込まれない上に、読込インジケータが出っぱなしになってにっちもさっちもいかないという事態になってしまいます。

この現象を解決する方法、または回避するアイデアはありませんでしょうか?

なお、無限スクロールはこのRailsCastsを参考にしています。
#114 Endless Page (revised) - RailsCasts

以下該当部分のソース(一部改変)です。

view

<div class="content">
  <ul class="userlist">
    <%= render @users %>
  </ul>
  <%= paginate @users %>
</div>

controller

def some_method
  ...
  @users = users.page params[:page]
  ...
end

some_method.js.erb

$('.userlist').append('<%= j render(@users) %>');
<% if @users.last_page? %>
  $('.pagination').remove();
<% else %>
  $('.pagination').replaceWith('<%= j paginate(@users) %>');
<% end %>

_user.html.erb

<li>
<!-- 割と長めのコンテンツが入る -->
</li>

もっと具体的に言えば、some_method.js.erbの<%= j render(@users) %>の出力の途中で切れてしまいます。
それ以降のif文はレスポンスに含まれていません。

環境など

Ruby 2.0.0、Rails4.0.0.beta1です。

ローカル環境で用いているWebrickの環境ではレスポンスが途切れることはありません。
フロントがNginx、バックがUnicornの環境ではこのエラーが度々確認されます。

レスポンスのサイズに問題があるのかと思って調べたのですが、よりサイズが大きい場合に成功したり、よりサイズが小さい場合に失敗したりするので、サイズはあまり関係ないのかもしれません。
また、ログを見た限りでは特にエラーは出ていないようでした。

回答

エラーが再現するデータを特定し、_user.html.erb の内容を静的コンテンツにして試してみるとどうでしょうか。
ところで、7/19 23:00 の時点の文章だと、質問ではなく、たんなるあなたのアプリの不具合報告のように見えます。本文を編集して、閲覧者が何を問われているのかがわかる「質問」をするとよいのではないでしょうか。エラーの原因がしりたいのか、エラー時の対策が知りたいのか、デバッグ手法が知りたいのかなどです。

編集 履歴 (1)
  • ありがとうございます。静的コンテンツにして検証してみたいと思います。また、文章についてはおっしゃる通りですね。。。本文を編集いたしました。 -
  • nginxの設定、proxy_buffer_sizeあたりで解消しました。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。