Rails资产:如何从其他应用程序引用图像?

时间:2012-04-18 00:19:48

标签: ruby-on-rails ruby-on-rails-3 nginx assets

Rails在预编译期间将图像名称移动到/ public / assets目录时为图像名称添加了md5哈希。问题是这些哈希值是不可预测的,所以我怎么知道在尝试链接它们时会调用它们?

例如,如果我正在托管名为flowers.jpg的图片,然后尝试在www.mysite.com/flowers.jpg上访问它,则会失败,因为该文件已重命名为flowers-4182172ae014ec23dc02739229c08dcc。

我知道Rails有帮助器会自动找到这些图像。但是,如果您尝试从完全不同的网站或应用程序链接到这些图像,该怎么办?有没有办法让Rails说,“好吧,我找不到flowers.jpg的预编译版本,所以我不会从/ app / assets服务/ public / assets服务。”?

编辑:根据这篇文章(http://stackoverflow.com/questions/10045892/rails-compiles-assets-both-with-and-without-md5-hash-why),Rails应该编译一个版本的我的资产有和没有md5哈希?知道为什么我的Rails副本没有生成没有指纹的版本吗?

2 个答案:

答案 0 :(得分:0)

Rails使用image_tag为您处理:

image_tag "myimage.jpg"

这将为您提供正确的网址。您可以编写一个小型服务,为您的as(未经测试)生成图像URL:

Class AssetsService < ApplicationController  
  def index
  end
end

index.js.haml

= image_tag "myimage.jpg"

答案 1 :(得分:0)

答案不是Rails。我不认为Rails是假设来编译没有指纹的图像。然而,它应该仍然可以为它们提供服务,并且我已经在我的nginx配置文件中添加了一些代码,以防止这种情况发生。这是违法的代码:

location ~* ^/assets/ {
    # Per RFC2616 - 1 year maximum expiry
    # http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
    expires 1y;
    add_header Cache-Control public;

    # Some browsers still send conditional-GET requests if there's a
    # Last-Modified header or an ETag header even if they haven't
    # reached the expiry date sent in the Expires header.
    add_header Last-Modified "";
    add_header ETag "";
    break;
}