Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从Rails资源管道中清除缓存_Javascript_Ruby On Rails_Caching_Ruby On Rails 3.1_Asset Pipeline - Fatal编程技术网

Javascript 从Rails资源管道中清除缓存

Javascript 从Rails资源管道中清除缓存,javascript,ruby-on-rails,caching,ruby-on-rails-3.1,asset-pipeline,Javascript,Ruby On Rails,Caching,Ruby On Rails 3.1,Asset Pipeline,我在Rails中启动了一个新项目,看起来application.js清单文件对我引用的Java脚本做了一些有趣的事情——它是否将这些文件缓存为资产管道的一部分 事情是这样的。我在vendor/assets/javascripts文件夹中添加了一个名为jquery.autoresize.js的javascript文件,然后在application.js清单中引用该文件,如下所示: //= require jquery.autoresize.js 然后我启动了rails服务器。但是在我的应用程序

我在Rails中启动了一个新项目,看起来application.js清单文件对我引用的Java脚本做了一些有趣的事情——它是否将这些文件缓存为资产管道的一部分

事情是这样的。我在vendor/assets/javascripts文件夹中添加了一个名为jquery.autoresize.js的javascript文件,然后在application.js清单中引用该文件,如下所示:

//= require jquery.autoresize.js 
然后我启动了rails服务器。但是在我的应用程序中浏览之后,我意识到我不小心添加了错误版本的jquery.autoresize.js文件。因此,我删除了该文件,然后将正确的版本添加到vendor/assets/javascripts文件夹中。但是,令我恐惧的是,当我重新加载页面时,它仍然在加载旧的javascript文件

我尝试清空浏览器缓存,然后退出并重新启动Rails服务器,但没有成功。我通过简单地重命名我的javascript文件并引用新名称,就拼凑出了一个解决方案,效果很好。但必须有更好的解决办法


新资产管道是否以某种方式缓存您引用的文件?如果是,如何清除缓存?谢谢你的帮助

Rails会在每次编辑内容时自动清除单个文件的缓存要清除单个文件的缓存,只需打开该文件,编辑一行代码,然后重新保存。Rails将清除该文件的缓存,浏览器将在下次加载页面时加载新文件

jquery.autoresize.js之所以使用文件的旧缓存版本,是因为删除了旧版本,然后用相同的名称将新版本复制并粘贴到同一文件夹中。由于文件本身从未被编辑过,Rails继续使用缓存的旧文件

这是因为资产管道对缓存使用指纹

指纹识别是一种使文件名依赖的技术 关于文件的内容。当文件内容更改时 文件名也会更改。对于静态或不频繁的内容 更改后,这提供了一种简单的方法来判断 即使在不同的服务器或部署日期之间,文件也是相同的

当文件名是唯一的并且基于其内容时,HTTP头可以 设置为鼓励到处缓存(无论是在CDN、ISP还是在 网络设备,或在web浏览器中)保存自己的 内容。当内容更新时,指纹将发生变化。 这将导致远程客户端请求新副本 内容。这通常称为缓存破坏

Rails用于指纹识别的技术是插入散列 将内容插入名称中,通常在末尾。例如CSS 可以使用其内容的MD5摘要重命名文件global.css:

因此,如果删除清单中引用的文件,然后以相同的名称复制到新文件中,则不会发生缓存破坏。编辑文件时,指纹将生效,并为文件名生成新的哈希。这会破坏该文件的缓存


有关完整的故事,请参见。

我假设我们讨论的是生产环境

当您在生产环境中更改任何Java脚本或样式表时,您需要运行
rake资产:precompile
;此任务编译和压缩各种.js和.css文件,并创建视图加载的application.js和application.css文件


如果将
jquery.autoresize.js
替换为具有较旧时间戳的版本,则预编译步骤可能会跳过它,认为编译的版本是最新的。通过首先运行
rake assets:clean
,强制它从头开始重建
public/assets
目录中的所有内容,可以避免这种情况。

我在
应用程序.rb中使用
config.assets.version='1.01019'
来破坏整个缓存。当我想要推送一个完整的新版本时,我会增加版本,这就完成了。这将解决Rails由于任何原因不能作为资源重新编译的边缘情况。

也可以尝试
rake assets:clobber
。这将完全重置所有内容并删除所有已编译的资产。此外,我通常需要在投入生产之前设置环境,方法是:
RAILS\u ENV=production rake assets:precompile
rake tmp:clear
为我做到了这一点,我使用了更少的RAILS。

我认为这是不对的。指纹基于文件的内容。如果你删除一个文件并用一个同名的文件替换它,你会得到一个不同的指纹和一个不同的文件名。谢谢你的来电。你最近在自己的项目中尝试过这个吗?因为我可以肯定地确认,当我创建这个问题时,我能让浏览器加载新文件的唯一方法是编辑一行代码并重新保存它。如果只是简单地删除文件并用同名的新文件替换它对您有效,我很想听听。Aaron是对的,我也有同样的问题(在开发模式下),并尝试了所有方法-
rake资产:clean
,然后
rake资产:precompile
,以及重新复制新文件并重新启动服务器。直到我打开新文件,在最后添加了几个虚拟单词,然后删除它们并保存文件,一切都不起作用。Rails变得太复杂了,这对它自身来说是不好的——你知道,当简单的事情需要复杂的步骤才能完成时,情况就是这样。不幸的是,甚至@user906230的解决方案都不起作用。Rails只是继续服务于旧文件,除了直接调试资产管道之外,我还完成了所有工作。如果有人已经解决了这个问题,请写一条评论。您可以在fi上运行
touch
,而不是编辑文件
global-908e25f4bf641868d8683022a5b62f54.css