2012-08-31 37 views
0

當使用鏈輪時,我有一個.coffee文件的完整目錄,它們會合並在一起併成爲'mobile_v2.js'。當這個文件得到服務時,一個美妙的ETag被設置與它的內容的SHA1哈希。這允許緩存破壞和其他一切美妙而好的事情正常工作。即,如果我修改了任何源.coffee文件並重新加載頁面,Sprockets將重新生成'mobile_v2.js'並將其發送到客戶端。如果我不改變任何東西,客戶端將使用它的該資源的緩存副本。這很好。如何獲取Sprockets生成資源的摘要?

現在我已經有了一個場景,其中的一部分Web應用程序使用Backbone.js,用戶可以花費很長時間在一個頁面上,而不需要執行完整的「刷新」...即,大量的AJAX更新,但沒有新的「......」。從字面上看,客戶可能會在本頁面上花費數週時間。因此,如果我將更新推送到JS/CSS資源,我需要一種方法讓客戶端檢測到這一點並觸發整個頁面的重新加載。做一次完整的重新加載是破壞性的,所以我不想經常這樣做。我也不想爲這些資源輪詢服務器......我擁有所有這些AJAX調用,所以我可以用額外的響應頭來捎帶這些調用。我所能做的一切。我只需要一個簡單問題的幫助:

給定生成的資源,如'mobile_v2.js',如何查詢Sprockets以獲取該文件的SHA1摘要?(從我的Ruby代碼)

回答

1

不知道如果我得到你的權利,但如果你預先編譯你的資產,一個辦法是從生成manifest.yml提取摘要

manifest = YAML.load(File.open(Rails.root.join("public", "assets", "manifest.yml"))) 
digest = manifest["mobile_v2.js"].gsub("mobile_v2-", "").gsub(".js", "") 
+0

我有兩個場景,生產(預編譯)和開發(未預編譯)。實際上,在生產中,我們使用git修訂版,但您的建議也會起作用。 –

0

要找到鏈輪消化產生的資產:

Rails.application.assets.find_asset(asset_name).digest 

在生產中,沒有鏈輪(*),所以我們使用git的版本(我們與git的文件夾部署)。或者,我想我們可以按照DavidO的建議閱讀manifest.yaml。

下面是完整的解決方案,我最終使用:

def asset_digest(asset_name) 
    if Rails.env == 'production' 
    # Production 
    Git.open(Rails.root).object('HEAD').sha 
    else 
    # Development/Test 
    Rails.application.assets.find_asset(asset_name).digest 
    end 
end 

(*):其實,在生產,鏈輪線「工作」,但通過重新編譯所有的資產,而不是讀了這樣做預編譯資產。