1

Railsアプリにページネーションを実装するためにJQueryを使用していますが、ブラウザに戻ったときにRailsがページコンテンツのレンダリングに失敗し、代わりに生のJavascriptをブラウザウィンドウにダンプするという問題に遭遇しました。ここで私が使用しているものを簡単に見てみましょう:

ページネーション.js:

if (history && history.pushState) {
  $(function () {
    $('.pagination a').live("click", function () {
      $.ajax({url: this.href, dataType: "script", cache: true});
      history.pushState(null, document.title, this.href);
      $("html, body").animate({ scrollTop: 0 }, 300);
      return false;
    });

    $(window).bind("popstate", function() {
      $.ajax({url: location.href, dataType: "script", cache: true});
    });
  });
}

私の見解では、index.js.erb:

$("#products").html("<%= escape_javascript(render("products")) %>");

時々動作しますが、戻るボタンを押すと、JSが評価/レンダリングされずにブラウザーウィンドウにダンプされることがよくあります。これは次のようになります(私のブラウザでは):

$("#products").html("<table class=\"table table-striped\">\n<thead>\n<tr>\n<th>Products

...等。何が失敗しているのか正確にはわかりません。何か案は?

4

1 に答える 1

0

ブラウザから要求されたパスは次のようになります

  • /製品
  • /製品?ページ=1
  • /製品?ページ=2

/products?page=2 が「手動で」参照されたか、ajax を介して参照されたかに応じて、js バージョンまたはプレーン バージョンをレンダリングします。戻るボタンを押すと、ブラウザのキャッシュにあるものを取得できます。これは、以前のナビゲーション履歴に応じて、これら 2 つのバージョンのいずれかになります。

これが適切に機能するためには、ブラウザがキャッシュの 2 つの別々のバージョンを維持する必要があります。これを行う 1 つの方法は、ajax リクエストを作成するときに追加のパラメーターを追加することです。

$('.pagination a').live("click", function () {
  $.ajax({url: this.href, dataType: "script", cache: true, data: {'ajax_paginate': true});
  ...
});

jquery-pjax はすでにこれを行っており、pjax-rails プラグインを使用すると、魔法のキャッシュ分離パラメーターが自動的に削除されます。

これを試す前に、ブラウザーのキャッシュを空にすることをお勧めします。おそらく、キャッシュには既に大量の不良データが含まれているでしょう。

于 2012-07-08T18:39:26.153 に答える