【问题标题】:Ruby on Rails caching images bugRuby on Rails 缓存图像错误
【发布时间】:2013-01-05 04:32:08
【问题描述】:

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

assets/images/subdir1/subdir2/myimage.jpg

这些图像是通过网站中的 JavaScript 动态加载的 (img.src = "assets/subdir1/subdir2/myimage.jpg")。出于某种原因,它们没有在生产环境中被缓存,而是使用 cache-control: no-cache 提供服务。

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

在我的 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 中递归找到的每个图像都应该是可缓存的? – Jeff 刚刚编辑

另一个编辑:

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

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

肯定有办法做到这一点...

【问题讨论】:

  • 缓存是什么意思?它们(生产中)是否在 public/assets/ 文件夹中?
  • 是的,它们在 public/assets/subdirectories...
  • 这很可能是 apache/nginx 配置问题。如果文件在那里,Rails 不会参与在生产环境中为它们提供服务

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


【解决方案1】:

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

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

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

有示例,请参阅Ruby on Rails Guide for Asset Pipeline 了解更多信息。见2.2.3 JavaScript/CoffeeScript and ERB段。

【讨论】:

  • 在这种情况下我不能使用asset_path函数,因为图像文件的src来自另一个拥有自己构建结构的JS/Coffee库......有什么解决方法吗?
  • 抱歉,您必须提供有关库和文件位置的更多信息。文件必须在库中或资产路径中。如果它们在资产路径中,则它们必须由资产路径控制。这是通过asset_path 方法完成的。
  • 这是我写的一些自定义 JS。基本上,我有一个自定义 JS 项目,它可以构建并将自身复制到 Ruby on Rails 目录中。在这个自定义 JS 中,我做了类似 img.src = "mydomain.com/assets/subdir1/subdir2/myimage.png" 这样的操作,但是图像不会被 RoR 缓存。也许有一种方法可以告诉 RoR 在 subdir1 中递归找到的每个图像都应该是可缓存的?
  • @Geoff 然后根本不要使用资产。这是错误的地方。而是在您的 Rails 项目中使用 public/images 或为您的图像文件使用一些 CDN。那将是最好的解决方案。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    这也将在此线程中进行讨论。 Setting Cache-Control headers on js assets in RAILS 3.1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-24
      • 1970-01-01
      • 2012-06-03
      • 2011-05-08
      • 1970-01-01
      • 1970-01-01
      • 2017-06-15
      相关资源
      最近更新 更多