2009-09-08 38 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,並且令人難以置信的印象深刻!