我試圖使用Jammit包裝CSS和JS的Rails應用程序部署在Heroku上,不開箱由於Heroku的工作只讀文件系統。我見過的每個例子都說明了如何做到這一點,建議事先構建所有打包的資產文件。由於Heroku基於Git的部署,這意味着每次更改這些文件時都需要對存儲庫進行單獨的提交,這對我來說不是一個可接受的解決方案。相反,我想改變這種狀況Jammit用來緩存包寫入#{Rails.root}/tmp/assets
(通過改變ActionController::Base#page_cache_directory
)的路徑,這是在Heroku上寫。靜態資產緩存與Jammit改變的ActionController :: Base的#page_cache_directory
什麼我不明白是怎麼緩存文件將沒有擊中Rails堆棧每次連使用緩存的軟件包的默認路徑中使用。讓我解釋一下我的意思是:
如果包括使用Jammit的助手一個包時,它看起來是這樣的:
<%= include_javascripts :application %>
生成這個腳本標籤:
<script src="/assets/application.js" type="text/javascript"></script>
當瀏覽器請求這個URL實際上發生的是它被路由到Jammit::Controller#package
,它將包的內容呈現給瀏覽器,然後將緩存副本寫入#{page_cache_directory}/assets/application.js
。這個想法是,這個緩存的文件是建立在第一個請求上的,後續的請求應該直接服務緩存的文件而不會碰到Rails堆棧。我查看了Jammit代碼,我不明白這是怎麼發生的。什麼阻止後續請求/assets/application.js
從簡單路由到Jammit::Controller
再也不使用緩存文件?
我的猜測是,有一個Rack中間件的地方,我沒有看到,供應的文件,如果它存在,並轉發到控制器的要求,如果它沒有。如果是這種情況,該代碼在哪裏?當改變ActionController::Base#page_cache_directory
(有效地改變Jammit寫入緩存包的位置)時它將如何工作?由於#{Rails.root}/tmp
位於公共文檔根目錄之上,因此沒有映射到該路徑的URL。
但請使用Rails.root.join('tmp')。 –
這個答案是> 2歲。現代的解決方案是Rails資產管道。 http://guides.rubyonrails.org/asset_pipeline.html – wuputah
許多人仍然喜歡jammit到資產管道,我知道我這樣做。 –