0

Chrome (バージョン 21) JavaScript コンソールで pjax を呼び出すと、開発ログに 2 つのリクエストが表示されます。この投稿で提案されているようにタイムアウトを変更しようとしましたが、それでも 2 つのリクエストが発生します。何か案は?

$.pjax({timeout: 4000,
      container: '[data-pjax-container]',
      url: document.location.href });
4

1 に答える 1

0

そのため、問題は、http本文に何も返さないアプリケーションテンプレートをレンダリングしていなかったことです。その結果、pjaxコードにより、リクエストは標準のGETにフォールバックしました。

アプリケーションテンプレートをレンダリングしなかったのはなぜですか?ええと、私はダミーで、アプリケーションコントローラーでこのメソッドを使用していました

def get_layout
  request.xhr? || request.headers['X-PJAX'] ? nil : 'application'
end

ここでの問題はcontent_for、index.html.hamlで使用していることです。

- content_for :sub_nav do
 # view code
- content_for :main do
 # view code

私のapplication.html.hamlテンプレートは次のようになりました...

.col1
  = yield :sub_nav
.col2
  = yield :main

これが解決策です...

コントローラメソッドをアプリケーションヘルパーにリファクタリングしました

  def is_pjax?
    request.xhr? || request.headers['X-PJAX'] ? true : false
  end

次に、ヘッダー、フッター、javascripts、cssなどのさまざまな要素をレンダリングしないようにアプリケーションビューを変更しました

= render :partial => '/shared/footer' unless is_pjax?

これで、.pjaxリクエストはページとテンプレート(左の列、メインなど)をレンダリングしますが、すでにロードされている既存の要素はレンダリングしません。

これが他の誰かに役立つことを願っています。

于 2012-09-12T17:06:18.777 に答える