2011-01-18 14 views
6

Tengo una aplicación de rieles que estoy tratando de obtener utilizando el almacenamiento en caché de aplicaciones HTML5 utilizando Rack :: Offline. El archivo application.manifest está configurado y está siendo descargado y verificado por mi página HTML. El manifiesto se ve de la siguiente manera:manifiesto de la aplicación HTML5 que no borra la memoria caché en el cambio de manifiesto

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 página que estoy accediendo es localhost: 3000/móvil, y se ha almacenado en caché maravillosamente (visible cuando tomo el servidor rieles). Sin embargo, el archivo application.manifest al que hace referencia ha cambiado (de hecho, cambia con cada solicitud al manipular el ID hexadecimal comentado), pero Chrome no está actualizando la página. El registro de la consola en Chrome ofrece lo siguiente:

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 

No entiendo por qué está fallando. ¡Parece estar haciendo todo lo que debería hasta la última línea! Obtengo un registro similar si navego en mi navegador a localhost: 3000/application.manifest - parece que el manifiesto se almacena en caché, ¿podría ser por eso que se queja de que el manifiesto ha cambiado? ¿Algunas ideas?

Gracias!

+0

Alguna vez resolver esto? Las respuestas a continuación son inútiles. –

+0

Resolvió mi problema y respondió a continuación. Espero que te sirva de algo si aún no lo has solucionado. –

Respuesta

1

que estaba teniendo el mismo problema, tuvo que realizar un cambio en la propia joya . Mi problema tenía que ver con las carpetas anidadas en/public/images

Comience por encontrar dónde están instaladas sus gemas ("entorno de gemas" obtendrá eso) y vaya a /rack-offline-0.6.1/lib.

Edite el archivo rack-offline.rb. Elimine la línea 33 y reemplace por:

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

Reinicie su servidor de raíles y vuelva a intentarlo. Funcionó para mí, espero que te ayude.

2

El último archivo solicitado por Chrome es application.manifest, si esto ha cambiado desde la solicitud original (como usted dice que tiene), entonces eso invalida la caché. Debe mantener el manifiesto sin cambios hasta que uno de los archivos enumerados en el manifiesto haya cambiado.

+0

Hola Robert. ¿No debería el cambio en el manifiesto solo pedirle a Chrome que descargue todo en el manifiesto? Eso es lo que el tutorial que estoy siguiendo parece decir (http://asciicasts.com/episodes/247-offline-apps-part-1): "Cuando el hash cambia esto instruye al navegador que el manifiesto de caché ha cambiado y que los archivos que enumera deben descargarse nuevamente. Esto sucederá con cada solicitud en modo de desarrollo, pero en producción solo ocurrirá cuando uno de los archivos cambie ". – kmc

+0

@kmc Sí, y como lo último que descarga es el manifiesto (nuevamente), y ese manifiesto ha cambiado, entonces la memoria caché de archivos que acaba de descargar se invalida. Puede verificar esto mirando el registro del servidor (que probablemente se envía a la consola). No tengo idea de la biblioteca que está utilizando, pero si está cambiando el archivo de manifiesto cuando no hay cambios en los archivos en el manifiesto, entonces no va a funcionar. – robertc

2

Esto ocurre en el modo de desarrollo de Rails todo el tiempo porque de forma predeterminada la clave se regenera cada vez que se golpea la página. Puede evitar esto configurando cache_classes en true en environments/development.rb. Sin embargo, tenga en cuenta que cache_classes no es específico de Rack::Offline. Por lo tanto, puede obtener un comportamiento ActiveRecord inesperado en su entorno de desarrollo, si realiza el cambio.

3

Rack :: Offline parece estar utilizando una ventana de tiempo para actualizar el hash en el archivo de manifiesto (lib/rack/offline.rb: 84).

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

# @cache_interval defaults to 10 seconds 

El archivo de manifiesto se pide el doble por el navegador: una vez al comienzo de la solicitud y fuera de línea una vez que toda la memoria caché se almacenó correctamente.

Cuando se maneja su solicitud toma un tiempo considerable (se deben cargar muchos activos) puede suceder que la primera solicitud se responda en una ventana de tiempo y la solicitud final se maneje en otra.Como consecuencia, los valores hash en ambos manifiestos no coincidirán y se obtiene como resultado el error "Error de caché de la aplicación: cambio de manifiesto durante la actualización, reintento de programación".

Con el fin de disminuir las probabilidades de tal error durante el desarrollo puede optar por establecer un mayor cache_interval de la siguiente manera:

offline = Rack::Offline.configure :cache_interval => 20 do 
    ... 
end 
Cuestiones relacionadas