2011-01-18 11 views
6

Rack :: Offlineを使用してHTML5アプリケーションキャッシュを使用して取得しようとしているレールアプリがあります。 application.manifestファイルがセットアップされ、HTMLページによってダウンロードされ、チェックされています。次のように マニフェストに見える:HTML5アプリケーションマニフェストがマニフェスト変更時にキャッシュをクリアしない

CACHE MANIFEST 
# 2d9bf2b03a07dc960fd8fe69659ceeffd4d28ccf8619669a506c3682bf223878 
404.html 
422.html 
500.html 
login.html 
stylesheets/scaffold.css 
javascripts/jquery.min.js 
javascripts/jquery.js 
javascripts/application.js 
javascripts/rmbz.js 
javascripts/rails.js 
images/rails.png 

NETWORK: 
/

私がアクセスしてるページはlocalhostです:3000 /モバイル、(私はレールのサーバーをダウン時に閲覧可能)、それは見事にキャッシュしています。しかし、それが参照するapplication.manifestファイルは変更されています(実際はコメント付きの16進IDを操作してリクエストごとに変更されます)が、Chromeはページを更新していません。 Chromeのコンソールログでは、次のように表示されます。

Document was loaded from Application Cache with manifest http://localhost:3000/application.manifest 
Application Cache Checking event 
Application Cache Downloading event 
Application Cache Progress event (0 of 12) http://localhost:3000/login.html 
Application Cache Progress event (1 of 12) http://localhost:3000/404.html 
Application Cache Progress event (2 of 12) http://localhost:3000/422.html 
Application Cache Progress event (3 of 12) http://localhost:3000/javascripts/rails.js 
Application Cache Progress event (4 of 12) http://localhost:3000/javascripts/rmbz.js 
Application Cache Progress event (5 of 12) http://localhost:3000/images/rails.png 
Application Cache Progress event (6 of 12) http://localhost:3000/500.html 
Application Cache Progress event (7 of 12) http://localhost:3000/javascripts/jquery.js 
Application Cache Progress event (8 of 12) http://localhost:3000/stylesheets/scaffold.css 
Application Cache Progress event (9 of 12) http://localhost:3000/javascripts/jquery.min.js 
Application Cache Progress event (10 of 12) http://localhost:3000/mobile 
Application Cache Progress event (11 of 12) http://localhost:3000/javascripts/application.js 
Application Cache Error event: Manifest changed during update, scheduling retry 

私はなぜそれが失敗しているのか分かりません。それは最後の行まですべきすべてをやっているようだ!ブラウザでlocalhost:3000/application.manifestに移動すると、同様のログが表示されます。マニフェストがキャッシュされているように見えるので、マニフェストが変更されていると不平を言うことができますか?何か案は?

ありがとうございます!

+0

今までこれが解決されます:開発中にこのようなエラーの確率を減少させるためには

次のように大きなcache_intervalを設定するように選択することができますか?以下の答えは役に立たない。 –

+0

私の問題を修正し、以下に答えました。もしあなたがまだこれを修正していないのであれば、それは役に立つかもしれない。 –

答えて

1

は、宝石自体に変更を加える必要がありました。私の問題は/ public/imagesのネストされたフォルダと関係していました。

宝石がどこにインストールされているかを調べることから始まります( "宝石環境"が得られます)、/rack-offline-0.6.1/libにナビゲートしてください。

ファイルrack-offline.rbを編集します。行33を削除して置き換えます。

"#{root}/images/**/*.png", 
"#{root}/images/**/*.jpg", 
"#{root}/images/**/*.gif"] 

レールサーバーを再起動してもう一度やり直してください。私のために働いた、それがあなたを助けることを願っています

2

Chromeが最後にリクエストしたファイルはapplication.manifestです(元のリクエストから変更されている場合)。この場合、キャッシュが無効になります。マニフェストに記載されているファイルのいずれかが変更されるまで、マニフェストを変更しないでください。

+0

こんにちは。マニフェストの変更は、マニフェスト内のすべてをダウンロードするようChromeに促すだけですべきですか?それは、私が次のチュートリアルで言っているようです(http://asciicasts.com/episodes/247-offline-apps-part-1):「ハッシュが変更されると、これはブラウザにキャッシュマニフェストが変更され、それがリストされているファイルを再度ダウンロードする必要があります。これは開発モードでのすべてのリクエストで発生しますが、実稼働環境ではファイルのいずれかが変更されたときにのみ発生します。 – kmc

+0

@ kmcはい、ダウンロードした最後のものがマニフェスト(もう一度)であり、そのマニフェストが変更されたので、ダウンロードしたファイルのキャッシュは無効になります。これはサーバログを見ることで確認できます(おそらくコンソールに出力されますか?)。使用しているライブラリについてはわかりませんが、マニフェストのファイルを変更していないときにマニフェストファイルを変更している場合は、動作しません。 – robertc

2

これは、デフォルトではページがヒットするたびにキーが再生成されるため、毎回Rails開発モードで発生します。これを回避するには、cache_classestrueに設定してenvironments/development.rbに設定します。ただし、cache_classesRack::Offlineに固有ではないことに注意してください。変更を加えた場合は、開発環境で予期しない何かが発生する可能性があります(ActiveRecord)。私は同じ問題を抱えていた

3

Rack :: Offlineはマニフェストファイル(lib/rack/offline.rb:84)でハッシュを更新するための時間ウィンドウを使用しているようです。

now = Time.now.to_i - Time.now.to_i % @cache_interval 

# @cache_interval defaults to 10 seconds 

マニフェストファイルはブラウザから2回要求されます。要求の開始時に1回、すべてのキャッシュが正常にオフラインで保存された時点です。

リクエストの処理にはかなりの時間がかかります(多くのアセットをロードする必要があります)。最初のリクエストが1つのタイムウィンドウで応答され、最後のリクエストが別のリクエストウィンドウで処理されることがあります。結果として、両方のマニフェストのハッシュが一致せず、結果として「アプリケーションキャッシュエラーイベント:更新中にマニフェストが変更され、再試行をスケジューリング」エラーが発生します。

offline = Rack::Offline.configure :cache_interval => 20 do 
    ... 
end 
関連する問題