2011-01-18 11 views
6

Ho un app rotaie che sto cercando di ottenere tramite la cache di applicazione HTML5 utilizzando Rack :: Offline. Il file application.manifest è impostato e viene scaricato e controllato dalla mia pagina HTML. Il manifesto appare come segue:applicazione HTML5 non manifestare a svuotare la cache sul cambiamento manifesta

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: 
/

La pagina che sto accedendo è localhost: 3000/cellulare, e ha cache meravigliosamente (visualizzabile quando prendo il server rotaie). Tuttavia, il file application.manifest a cui fa riferimento è stato modificato (in effetti cambia a ogni richiesta manipolando l'id esadecimale commentato), ma Chrome non sta aggiornando la pagina. Il log di console in Chrome fornisce quanto segue:

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 

Non capisco perché non funziona. Sembra che stia facendo tutto ciò che dovrebbe fino all'ultima riga! Ottengo un registro simile se navigo nel mio browser su localhost: 3000/application.manifest - sembra che il manifest sia memorizzato nella cache stessa, quindi potrebbe essere il motivo per cui si lamenta che il manifest è cambiato? Qualche idea?

Grazie!

+0

mai ottenere questo risolto? Le risposte qui sotto non sono di aiuto. –

+0

Risolto il problema e ho risposto di seguito. Spero che sia utile se non lo hai già risolto. –

risposta

1

ho avuto lo stesso problema, ha dovuto fare una modifica al gioiello in sé . Il mio problema aveva a che fare con le cartelle nidificate in/public/images

Inizia a cercare dove sono installate le gemme ("l'ambiente gemma" ti arriverà) e naviga in /rack-offline-0.6.1/lib.

Modificare il file rack-offline.rb. Cancellare la riga 33 e sostituirla con:

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

Riavviare il server di rotaie e riprovare. Ha funzionato per me, spero che ti aiuti.

2

L'ultimo file richiesto da Chrome è application.manifest, se questo è cambiato rispetto alla richiesta originale (come si dice che lo ha), quindi invalida la cache. È necessario mantenere il manifest invariato fino a quando uno dei file elencati nel manifest non è cambiato.

+0

Ciao Robert. Non dovresti cambiare il manifest appena chiedi a Chrome di scaricare tutto nel manifest? Questo è quello che il tutorial che sto seguendo sembra dire (http://asciicasts.com/episodes/247-offline-apps-part-1): "Quando l'hash cambia questo indica al browser che il manifest della cache è cambiato e che i file che elenca devono essere nuovamente scaricati. Ciò avverrà ad ogni richiesta in modalità di sviluppo, ma in produzione avverrà solo quando uno dei file cambia. " – kmc

+0

@kmc Sì, e poiché l'ultima cosa che scarica è manifest (di nuovo) e quel manifest è cambiato, la cache dei file appena scaricati è invalidata. È possibile verificare ciò osservando il log del server (che probabilmente viene inviato alla console?). Non ho idea della libreria che stai usando, ma se sta cambiando il file manifest quando non ci sono modifiche ai file nel manifest, non funzionerà. – robertc

2

Questo avviene in modalità di sviluppo Rails ogni volta perché per impostazione predefinita la chiave viene rigenerata ogni volta che la pagina viene colpito. È possibile aggirare questo impostando cache_classes a true in environments/development.rb. Tuttavia, tieni presente che cache_classes non è specifico per Rack::Offline. Quindi potresti ottenere un comportamento imprevisto ActiveRecord nel tuo ambiente di sviluppo, se apporti la modifica.

3

Rack :: Offline sembra utilizzare una finestra di tempo per aggiornare la hash nel file manifesto (lib/cremagliera/offline.rb: 84).

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

# @cache_interval defaults to 10 seconds 

Il file manifesto viene richiesta due volte dal browser: una volta all'inizio della richiesta e non in linea una volta che tutta la cache è stato memorizzato con successo.

Quando si maneggia la richiesta richiede molto tempo (un sacco di beni devono essere caricato) può accadere che la prima richiesta è risolta in una finestra di tempo e la richiesta finale è gestita in un altro.Di conseguenza, gli hash in entrambi i manifesti non corrispondono e si ottiene di conseguenza l'errore "Errore di cache delle applicazioni: Manifest cambiato durante l'aggiornamento, riprova pianificando" di conseguenza.

Al fine di ridurre le probabilità di un tale errore durante lo sviluppo è possibile scegliere di impostare una maggiore cache_interval come segue:

offline = Rack::Offline.configure :cache_interval => 20 do 
    ... 
end 
Problemi correlati