2

使用 Ruby on Rails 3.1,我在以下目录中有一些 JPG:

assets/images/subdir1/subdir2/myimage.jpg

这些图像是通过网站中的 JavaScript 动态加载的 (img.src = "assets/subdir1/subdir2/myimage.jpg")。出于某种原因,它们没有在生产中被缓存,而是使用缓存控制:无缓存。

如何确保这些图像被缓存?

在我的 production.rb 文件中,我有这样的内容:

  # Precompile additional assets (application.js, application.css, and all non-JS/CSS are already added)
  config.assets.precompile += ['jquery-1.8.3.min.js', 'json2.min.js']

认为图像将根据该评论被缓存。

编辑更多信息:

JavaScript 是我编写的自定义 JS。基本上,我有一个自定义 JS 项目,它可以构建并将自身复制到 Ruby on Rails 目录中。在这个自定义 JS 中,我做了类似 img.src = "mydomain.com/assets/subdir1/subdir2/myimage.png"; 这可行,但是图像不会被 RoR 缓存。也许有一种方法可以告诉 RoR 在 subdir1 中递归找到的每个图像都应该是可缓存的?– 杰夫刚刚编辑

另一个编辑:

也许我可以编写自己的处理程序来服务文件并说它们应该被缓存?

或者在他们的文件夹中放置一个特殊的配置文件(比如 .htaccess 用于 Apache 服务器?)

当然有办法做到这一点......

4

3 回答 3

2

您必须使用 rails 的助手来提供文件。只有这样,rails 才能判断该文件是否已更改。如果您使用帮助程序,Rails 会知道哪些文件已更改并提供正确的路径。尝试这个:

# access to asset_path through helper.
img.src = "<%= asset_path('subdir1/subdir2/myimage.jpg') %>"   

如果您以正确的方式使用资产管道,rails 将在文件更改时生成文件的新路径,并且您不会与位于同一 url 后面的新图片打架。

有示例,请参阅资产管道的 Ruby on Rails 指南以获取更多信息。请参阅第2.2.3 段 JavaScript/CoffeeScript 和 ERB

于 2013-01-06T19:49:13.083 回答
1

究竟是什么样的缓存?如果您想更改提供图像的 http 标头,那么这确实是一个关于如何配置 Web 服务器 (Apache) 的问题。

如果您希望它们在 public/assets 目录中被 rails 缓存,我认为您应该在 deoloying 时运行资产预编译 rake 任务,尽管可能没有必要。

于 2013-01-16T16:14:14.300 回答
0

通常在生产环境中,您会使用 apache/nginx 等来提供静态资产。如果您希望 rails 应用程序提供静态内容,那么您需要在配置中启用它

config.serve_static_assets = true
config.static_cache_control = "public, max-age=172800"

这也在这个线程中讨论。在 RAILS 3.1 中为 js 资产设置 Cache-Control 标头

于 2013-01-19T11:05:20.020 回答