3

我剛從Ruby on Rails 3.0.10切換到3.1.0,並且使用jQuery UI 1.8.14。我有一個問題在生產模式加載css文件在遠程機器上。部署資產管道時的問題(生產模式)

在我app/views/layouts/application.html.erb文件我有:

<%= stylesheet_link_tag 'application', 'jquery-ui-1.8.14.custom', 'jquery-ui-1.8.14.custom_redefinition' %> 
<%= javascript_include_tag 'application' %> 

注:jquery-ui-1.8.14.custom文件是使用Theme Roller生成的CSS文件和jquery-ui-1.8.14.custom_redefinition是我的「自定義重新定義」文件來替換一些CSS類。這些文件(擴展名爲.css)位於vendor/assets/stylesheets

開發模式在我的本地機器上似乎都可以工作,但是當我用Capistrano部署到遠程機器時,它不再工作。也就是說,jQuery UI相關文件沒有按預期加載:如果我嘗試訪問它們,它們的內容是空白\空白(我可以看到,在爲我的應用程序網頁生成的源HTML代碼中)。

我該如何解決這個問題?


這時我config/environments/production.rb文件我有:

# Compress JavaScripts and CSS 
config.assets.compress = true 

# Don't fallback to assets pipeline if a precompiled asset is missed 
# 
# Note: Since, at this time, the asset Pipeline doesn't work for me I am 
# following the "Live Compilation" approach (more info at 
# http://guides.rubyonrails.org/asset_pipeline.html#in-production) 
config.assets.compile = true 

# Generate digests for assets URLs 
config.assets.digest = true 

在我app/assets/stylesheets/application.css.scss文件我有:

/* 
*= require_self 
*= require_tree . 
*/ 

在我app/assets/stylesheets/application.js文件我有:

//= require jquery 
//= require jquery_ujs 
//= require jquery-ui 
//= require_tree . 

在部署之前,在我的本地機器,我運行以下命令:

bundle exec rake assets:precompile 

:如果我運行上面的命令,jquery-ui-1.8.14.customjquery-ui-1.8.14.custom_redefinition文件按預期在public/assets目錄下生成


也許問題是關係到在app/assets/stylesheets/application.css.scss文件不加載不存在於vendor/assets/stylesheets目錄中的文件的require_tree .聲明。

回答

7

這裏有幾個問題,我會分別處理每個問題。

爲什麼這被打破

有資產在生產和開發模式與訪問摘要開啓方式的差異。在開發過程中,正常工作。鏈輪用未使用的文件名服務於應用程序/資產。這很像Sprockets不存在,但記住/資產是一個掛載點(Sprockets是一個Rails引擎),所以下面的文件全部被提供鏈輪。

在生產中使用摘要的文件名被使用,所以鏈輪期望這些名稱被請求而不是原件。他們有效地隱藏/資產背後的掛載點

如何解決這個

的第一件事是更新你application.css這樣:

 
/* 
*= require_self 
*= require jquery-ui-1.8.14.custom' 
*= jquery-ui-1.8.14.custom_redefinition: 
*/ 

和stylsheet鏈接標籤這樣的:

<%= stylesheet_link_tag 'application' -%>

這可以確保你的CSS供應(與合作mpiled)到一個文件。當你運行預編譯時,由於Rails中的錯誤,UI文件最終位於/ assets目錄中,所以不要依賴它(它將在Rails 3.1.2中修復)

你需要做的第二件事是將你的圖像(如果你還沒有這樣做)移動到資產/圖像。

第三件事是擴展.erb添加到UI文件的文件夾的樣式表:

jquery-ui-1.8.14.custom.css.erb

的最後一件事是改變所有參考圖像在CSS文件中使用的asset_path幫手。從這樣的:

url(images/ui-bg_gloss-wave_35_f6a828_500x100.png)

這樣:

URL(<%= asset_path( 'UI-bg_gloss-wave_35_f6a828_500x100.png')%>)

在開發模式執行這個作爲測試 - 它應該工作正常。

在生產模式下,助手用正確的指紋名替換普通文件名,以便訪問資產。

對於生產來說有點棘手。您應該堅持使用默認設置,即將所有資產預先編譯到/ assets目錄中。

我會檢查管道指南的last section,並確保所有配置文件都與示例中的設置相匹配。

最後一件事是確保您有Capistrano設置爲您運行預編譯作業。查看指南的precompiling assets部分以獲取有關如何設置的信息。

這應該讓事情再次運作。

您可以(作爲替代不使用管道的這些圖像)將UI文件移動到/ public下的目錄,並從CSS訪問它們。您需要更改所有圖像參考。既然你必須改變他們,我會堅持管道的方式。

+0

我在Capistrano上使用'load'deploy/assets''來解決預編譯資產*時出現問題:http://stackoverflow.com/questions/7549214/rails-3-1-and-資產管線故障上部署與 - Capistrano的。在Ruby on Rails Asset Pipeline指南中解釋的* Server Configuration *怎麼樣?*順便說一句*:在Rails 3.1.2中將解決的錯誤怎麼樣? – Backo

+0

我不確定Cap爲什麼不起作用,但是關於服務器配置,這是最佳做法,但不是強制性的。沒有你失去了未來標題的緩存benfit,但它應該仍然工作。 –

+0

這個bug的請求在這裏:https://github.com/rails/rails/pull/2876 –