Rails中没有缓存时间戳的资产URL

时间:2009-10-18 01:17:09

标签: jquery ruby-on-rails url caching

我正在使用带Google IE fix库的透明PNG。此修复仅适用于以“-trans.png”结尾的图像网址。

Rails基于时间戳的缓存导致了这个问题。当我使用image_path()生成图像的URL时,它会将文件的最后修改时间戳附加到图像的查询字符串。由于网址不再以“-trans.png”结尾(而是以“?”加上一个长整数结尾),因此Google的javascript无法激活。

我不想disable asset caching entirely;只是在某些图像上。我也不想将相对URL硬编码到服务器的根目录。如果站点部署到服务器根目录或(未知)子目录,我想使用Rails正确生成URL。

我有哪些选择?

3 个答案:

答案 0 :(得分:1)

# apologies I'm doing this off the cuff and haven't run-tested this code
alias_method_chain :image_path, :google_sense

def image_path_with_google_sense(source)
  raw_image_path = image_path_without_google_sense(source)
  if source.end_with?('-trans.png')
    # strip off the time stamp
    raw_image_path.split('?').first
  else
    raw_image_path
  end
end

答案 1 :(得分:0)

我提出了一种完全不同的方法来解决这个问题,使用jQuery替换相应的URL:

jQuery(document).ready(function($) {
  $("img.logo").attr("src", "/images/logo-trans.png");
});

这样做的好处是我可以使用IE的条件HTML注释来进行缓存剥离IE。

答案 2 :(得分:0)

最简单的解决方案可能只是在将资产标记附加到文件名后添加一个特殊情况,以使其正常工作,例如:

   def rewrite_asset_path(source)
      asset_id = rails_asset_id(source)
      if asset_id.blank?
        source
      elsif source.end_with?("-trans.png")
        "#{source[0..-11]}.#{asset_id}-trans.png"
      else
        source + "?#{asset_id}"
      end
    end

这样,任何图像都会重写其路径,使内存缓存无效。这仍然可以像你期望的那样工作。