使用Heroku上的Rails3更新公用文件夹中的静态资源

时间:2017-02-14 15:09:21

标签: ruby-on-rails ruby-on-rails-3 heroku

我的Rails应用程序的公共文件夹中有一些文件不属于资产管道(例如sitemap.xml或可嵌入小部件的.js文件)。

虽然我在更新public / assets文件夹中的资产时没有问题,但是我更新这些静态文件时遇到了麻烦。奇怪的是,我可以添加新文件,但我无法更新现有文件。当我在开发中更新它们时,在生产环境(Heroku)中不会考虑修改。

我尝试了很多东西,但似乎无法找到解决方案。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

对于那些可能带着同样问题到达这里的人,我最终得到了Heroku支持团队的解决方案。我选择了清除缓存的最后一个选项(Rails.cache.clear),因为我在Memcachier中没什么重要的。

以下完整回复:

  

您好,

     

我是来自Ruby Task Force的Terence。我已经调查过你的问题了   我相信正在发生的事情是正常的,甚至是预期的   那不是你想要的。让我解释一下。

     

您看到旧robots.txt的原因是机架缓存。   您可以通过卷曲URL来告知验证。

     

值得注意的是,有一个X-Rack-Cache标头。即使你删除了   public / robots.txt,它也不存在于slug中,因为它   通过HTTP缓存存在于Rack-Cache中。 Rails将跳过整个   链,只返回缓存中的内容。尾随你会看到的日志   这在heroku路由器中:

     

2017-12-27T03:15:23.870134 + 00:00 heroku [router]:at = info method = GET   path =“/ robots.txt”host = [隐藏]   request_id = 5caea3e9-a665-4b52-b61f-c7ebf210e155 fwd =“74.108.35.53”   dyno = web.1 connect = 0ms service = 4ms status = 200 bytes = 576 protocol = https

     

但由于这个原因,你不会看到相应的日志。你可能是   能够通过与Rack :: Cache的交互看到更多信息   设置详细。我去尝试将您的代码部署到一个新的应用程序和   无法重现这个问题。

     

要解决此问题,您可以尝试使用机架缓存配置   allow_revalidate:

     

一个布尔值,指定是否重新验证客户端发送的请求   应该受到缓存的尊重。启用此选项时   (rack-cache.allow_revalidate为true),包含a的请求   Cache-Control:max-age = 0标头使缓存承担其副本   响应过时,导致条件GET /验证   请求发送到服务器。

     

大多数浏览器在用户时都包含Cache-Control:max-age = 0标头   执行刷新(例如,单击“刷新”按钮)。

     

重要提示:全局启用此选项可使所有客户端中断   你的缓存。

     

应该允许您破坏该页面的缓存。如果失败了   您可以尝试通过Rails.cache.clear或清除memcache插件   通过Memcachier本身。如果你走这条路,它会吹   memcache里面的一切都消失了。

答案 1 :(得分:0)

Heroku有一个不可变的文件系统,这意味着您无法对文件系统进行更改或添加。你需要一个不同的策略。提供来自其他服务的文件,将它们放入数据库,或将它们外部链接到Amazon S3。

但我不确定我到底知道你所指的过程的确切部分。您是在谈论在构建中生成的文件,还是在运行服务期间修改的文件?

答案 2 :(得分:-1)

/public/assets文件夹是自动生成的,因此您无法直接将文件插入其中。实际上,此文件夹应位于.gitignore中,这可以解释您的更改未传播到生产的原因。也就是说,它们不会包含在您的提交中。

完全静态资源(例如sitemap.xml)应该进入/public文件夹。 js文件和实际上是网站执行一部分的其他文件应该放在/app/assets/javascripts之一(仅适用于此网站的代码),/lib/assets/javascripts(适用于您公司之间共享的代码/项目),/vendor/assets/javascripts文件夹(来自外部来源的代码)。

您可以在此处阅读更多内容:http://guides.rubyonrails.org/asset_pipeline.html