我正在更新Rails 3應用程序以使用Rails 3.1,並且正在使用新的資產管道作爲其中的一部分。到目前爲止,除了一個我無法解決的令人討厭的問題之外,我已經完成了所有工作。在部署到子URI時在Rails 3.1中損壞的預編譯資產
應用程序及其所有資產在開發中工作正常,但在生產中它使用Passenger(http://the-host/sub-uri/
)部署到子URI。問題在於資源是在部署期間預先編譯的,我的一個CSS(嗯,它是一個.css.scss
文件)文件正在利用sass-rails
gem的image-url
幫手。在
body { background-image: image-url("bg.png"); }
結果是:由於在預編譯過程中,路徑是硬編碼到預編譯的CSS文件,子URI是沒有考慮到:
在我.css.scss
文件編譯application-<md5-hash-here>.css
文件:
body { background-image: url(/assets/bg.png); }
它應該是什麼使它正常工作:
body { background-image: url(/sub-uri/assets/bg.png); }
這種情況只是要求太多嗎?如果是這樣,我將不得不切換回舊的非資產流水線方式,只需從public
提供我的圖像和CSS。然而,這似乎是應該考慮和解決的事情......?我錯過了解決方案嗎?
編輯1:我應該注意使用erb solution,而不是產生同樣的結果,正如人們所期望的那樣。
編輯2:響應貝努瓦閣樓的評論
沒有,問題是不相關的config.assets.prefix
。我試圖設置(到/sub-uri/assets
而不是默認的/assets
),但事實證明這是錯誤的做法 - 它似乎已經與Rails應用程序的根,而不是服務器相關。刪除(並因此返回到默認值)已經修復了造成的所有奇怪問題(並且有很多,所有資產都以/sub-uri/sub-uri/assets
結尾 - 這非常奇怪)。唯一的問題是image-url
助手和朋友在預編譯時不會選擇子URI。不用說,這是合乎邏輯的,因爲當它被預編譯時,它不可能知道當它在Passenger下運行時,它將以這種方式配置。我的問題是如何通知它這一點,從而結束預編譯結果中的正確路徑。如果確實可以做到。
我目前的解決方法是在CSS中引用iamge,如下所示:url(../images/bg.png)
並將其置於非流水線public/images
的位置。很不理想,因爲它不會受益於指紋和管道所提供的一切。
你試過這個嗎? http://stackoverflow.com/questions/7295744/how-to-deploy-rails-3-1-app-in-a-subdirectory –
該應用程序本身部署得很好(它確實使用RailsBaseURI方法,因爲它是乘客文檔推薦)。從正在運行的應用程序中鏈接到的所有資源,如使用'image_tag'等的圖像等都沒有問題。唯一的問題是從CSS內引用的圖像 - 在預編譯資產時它不知道子URI。正因爲如此,我需要一個解決方案。 –
所以你的問題是'image-uri'幫手沒有拿起'config.assets.prefix'? –