Ruby on rails HTML5应用程序清单在清单更改时未清除缓存

Ruby on rails HTML5应用程序清单在清单更改时未清除缓存,ruby-on-rails,caching,html,offline,Ruby On Rails,Caching,Html,Offline,我有一个rails应用程序,我正试图通过使用Rack::Offline使用HTML5应用程序缓存来获取它。application.manifest文件已设置,正在下载并由我的HTML页面检查。 清单如下所示: CACHE MANIFEST # 2d9bf2b03a07dc960fd8fe69659ceeffd4d28ccf8619669a506c3682bf223878 404.html 422.html 500.html login.html stylesheets/scaffold.css

我有一个rails应用程序,我正试图通过使用Rack::Offline使用HTML5应用程序缓存来获取它。application.manifest文件已设置,正在下载并由我的HTML页面检查。 清单如下所示:

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:
/
offline = Rack::Offline.configure :cache_interval => 20 do
    ...
end
我正在访问的页面是localhost:3000/mobile,它的缓存非常好(当我关闭rails服务器时可以看到)。但是,它引用的application.manifest文件已经更改(事实上,它通过操作注释的十六进制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,我会得到一个类似的日志-看起来清单本身被缓存了,这可能是它抱怨清单已更改的原因吗?有什么想法吗


谢谢

Chrome请求的最后一个文件是
application.manifest
,如果该文件自原始请求(如您所说)以来发生了更改,则缓存将失效。您需要保持清单不变,直到清单中列出的一个文件发生更改。

这在Rails开发模式下每次都会发生,因为默认情况下,每次点击页面时都会重新生成密钥。您可以通过在
environments/development.rb
中将
cache\u classes
设置为
true
来解决这个问题。但是,请注意,
cache\u类
并非特定于
Rack::Offline
。因此,如果您进行了更改,您可能会在您的开发环境中遇到一些意想不到的
ActiveRecord
行为。

请签出并重试


它解释了与缓存、脱机、rails/jquery等相关的所有问题。

我也遇到了同样的问题,不得不对gem本身进行更改。我的问题与/public/images中的嵌套文件夹有关

首先查找gem的安装位置(“gem环境”将为您提供安装位置),然后导航到/rack-offline-0.6.1/lib

编辑文件rack-offline.rb。删除第33行并替换为:

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

重新启动rails服务器并重试。为我工作,希望对您有所帮助。

Rack::Offline似乎在使用时间窗口刷新清单文件(lib/Rack/Offline.rb:84)中的哈希

浏览器会两次请求清单文件:一次是在请求开始时,一次是所有缓存成功脱机存储

当处理您的请求需要相当长的时间(必须加载大量资产)时,第一个请求可能在一个时间窗口中得到响应,而最终请求则在另一个时间窗口中得到处理。因此,两个清单中的哈希值将不匹配,因此会出现“应用程序缓存错误事件:清单在更新期间更改,计划重试”错误

为了减少开发过程中发生此类错误的几率,您可以选择按如下方式设置更大的缓存间隔:

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:
/
offline = Rack::Offline.configure :cache_interval => 20 do
    ...
end

你好,罗伯特。清单中的更改不应该只是提示Chrome下载清单中的所有内容吗?这就是我下面的教程所说的():“当散列更改时,这会指示浏览器缓存清单已更改,并且它列出的文件需要再次下载。在开发模式下的每个请求都会发生这种情况,但在生产模式下,只有当其中一个文件更改时才会发生这种情况。”@kmc Yes,由于它最后下载的是清单(再次),并且清单已经更改,那么它刚刚下载的文件缓存将失效。您可以通过查看服务器日志(可能输出到控制台?)来验证这一点。我不知道您正在使用的库,但是如果它在清单中的文件没有更改的情况下更改清单文件,那么它将无法工作。是否解决了此问题?下面的答案没有帮助。修复了我的问题并在下面进行了回答。如果您尚未修复此问题,希望它会有所帮助。