Chrome (バージョン 21) JavaScript コンソールで pjax を呼び出すと、開発ログに 2 つのリクエストが表示されます。この投稿で提案されているようにタイムアウトを変更しようとしましたが、それでも 2 つのリクエストが発生します。何か案は?
$.pjax({timeout: 4000,
container: '[data-pjax-container]',
url: document.location.href });
Chrome (バージョン 21) JavaScript コンソールで pjax を呼び出すと、開発ログに 2 つのリクエストが表示されます。この投稿で提案されているようにタイムアウトを変更しようとしましたが、それでも 2 つのリクエストが発生します。何か案は?
$.pjax({timeout: 4000,
container: '[data-pjax-container]',
url: document.location.href });
そのため、問題は、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リクエストはページとテンプレート(左の列、メインなど)をレンダリングしますが、すでにロードされている既存の要素はレンダリングしません。
これが他の誰かに役立つことを願っています。