2009-10-18 66 views
2

我对Google IE fix库使用透明PNG。此修补程序仅适用于以“-trans.png”结尾的图片网址。Rails中没有缓存时间戳的资产URL

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

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

我有什么选择?

回答

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 
+0

我希望避免不必去掉查询字符串,但这是目前唯一的答案。感谢:-) – 2009-10-18 02:14:35

0

我想出了解决这个问题的一个完全不同的方式,使用jQuery来代替相应的网址:

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

这样做的好处是,我可以让缓存剥离IE-只使用IE的条件HTML注释。

+1

有趣的,但你的示例代码有几个问题,喜欢用页面上的类“logo”替换每个IMG标签,如果你是代码中唯一的人,但可能是一个很大的WTF时刻,如果if一些其他设计师使用相同的标签/类组合来制作另一张图像。 此外,这只适用于一个特定的图像。你在你的问题中隐含着你想要“修复”的多个图像,所以你可能会更喜欢在“src”值上进行一些模式匹配,我认为jQuery可以做到这一点。 – 2009-10-18 11:23:57

+1

是的,你可以使用这个:$(“img [src * =' - trans.png']”) – 2009-10-18 11:29:01

+0

是的,你就在那里。 – 2009-10-18 20:17:18

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 

这样任何图像都会有自己的路径重写内联cache-buster。这仍然可以像你期望的那样工作。