2009-09-08 73 views
10

因此,Rails时间戳非常好。我正在使用它将过期标题添加到以10位数时间戳结尾的所有文件。然而,我的大部分图像都是在我的CSS中引用的。有没有人遇到过任何允许将时间戳添加到CSS引用图像的方法,或者一些实现此目的的时髦重写规则?我很喜欢我网站上的所有图像,无论是内联还是在CSS中都有这个时间戳,所以我可以告诉浏览器缓存它们,但只要文件本身发生变化就刷新。Rails在CSS中的图像时间戳

我在网上找不到任何关于这个的东西,我不敢相信这不是一个更频繁讨论的话题。

我不认为我的设置会影响,因为实际的期满将希望发生同样的方式的基础上,10位时间戳,但我使用Apache服务的所有静态内容,如果该事项

+0

看到我的回答下面,我认为现在最好的解决方案,现在它使用Jammit,包装,它支持这个开箱即用 – brad 2010-08-27 14:33:45

回答

4

您可以通过获取文件的修改时间这样的附加每个图像文件的实际时间戳现在黑客变得越来越丑陋,但是......你会认为会有更像Rails的方式来做到这一点。

+0

你的正则表达式在引号出现时并不适合我。使用'/ url \(([''] *)([^ \ n'“] +)([''] *)\)/'作品 – 2010-07-04 06:16:55

+0

This works awesome!Thank you! – CalebHC 2010-08-27 00:07:51

5

我一直在使用asset packager,最后我编辑了插件的compress_css方法来解决这个问题。我基本上只是正则表达式中的CSS图像,插入当前时间戳记:

timestamp = Time.now.to_s.gsub(/\D/, '') 
source.gsub!(/url\((['"])(.+)(['"])\)/) do 
    open, file, close = $1, $2, $3 
    if file =~ /.\.(ico|css|js|gif|jpe?g|png)/ 
    "url(#{open}#{file}?#{timestamp}#{close})" 
    else 
    "url(#{open}#{file}#{close})" 
    end 
end 

这样一来,每当我部署,压缩CSS图像包含附加时间戳。这种方法的缺点是每个图像都没有自己的时间戳,所以每次部署新的css时,所有的css图像都是“过期”的。总比没有,除非你经常部署CSS。

source.gsub!(/url\((['"]*)(.+)(['"]*)\)/) do 
     open, file, close = $1, $2, $3 
     css_dir = File.join(RAILS_ROOT,"public/stylesheets") 
     timestamp = '' 
     FileUtils.cd(css_dir) do 
     if file =~ /^\// # absolute path 
      f = File.new(RAILS_ROOT + "/public" + file) 
     else # relative path 
      f = File.new(file) 
     end 
     timestamp = f.mtime.to_i.to_s 
     end 

     if file =~ /.\.(ico|css|js|gif|jpe?g|png)/ 
     "url(#{open}#{file}?#{timestamp}#{close})" 
     else 
     "url(#{open}#{file}#{close})" 
     end 
    end 

(!有可能写这个更优雅的方式,我的红宝石扒仍然疲软) :

+0

有趣的是,虽然我绝对同意,它不是理想的有一个时间戳vs每个文件有它自己适当的时间戳,但我认为这比没有好。 Thx为小费。 – brad 2009-09-08 14:54:33

3

最好的解决方案似乎是使用ERB来生成您的样式表,以便您可以使用Rails image_ helpers而不是直接图像路径。意思是,摆脱你的public/stylesheets/application.css文件并创建app/views/stylesheets/application.css.erb。您还必须创建一个控制器并启用缓存,并设置路由。

以下是完整的细节:在这个 http://deaddeadgood.com/2009/9/28/far-future-expires-headers-for-css-images-in-rails

+0

perfect!在附注中,我也刚刚开始阅读关于Jammit http://documentcloud.github.com/jammit/。看起来,它也是一个非常好的解决方案,用于在rails中进行资产打包。 – brad 2009-11-20 00:04:52

3

如果有人跌倒,Jammit现在支持这一开箱即用。我一直在一个新项目上使用jammit,并且令人难以置信的印象深刻!