2011-12-08 37 views
9

我正在運行Rails 3.1.3,它包括Sprockets 2.0.3作爲依賴項。Rails資產管道上的分期:正確的指紋,但404ing

我建立了我的登臺環境,以配置Rails指南爲生產建議的方式。

config.serve_static_assets = false 
config.assets.compress = true 
config.assets.compile = false 
config.assets.digest = true 

我已經包含在我的Capfile

load 'deploy' 
load 'deploy/assets' 

而上部署如預期資產獲得預編譯。

在公共/資產方面,我發現預期帶有指紋的資產。

application-bd402855d34fb61e0a1690da06f79f20.js 
application-bd402855d34fb61e0a1690da06f79f20.js.gz 
application-ed3f9a8d23992790841c11b6692fb576.css 
application-ed3f9a8d23992790841c11b6692fb576.css.gz 
...and a bunch of images... 

當我加載頁面時,我看到正確的引用,指紋和所有。

<link href="/assets/application-ed3f9a8d23992790841c11b6692fb576.css" media="screen" rel="stylesheet" type="text/css"> 
<script src="/assets/application-bd402855d34fb61e0a1690da06f79f20.js" type="text/javascript"></script> 

但是,一切404s,CSS,JS,圖像,一切。

任何人都知道這筆交易在這裏?謝謝!

+0

您是運行staging作爲'production'還是您有staging.rb配置文件?如果是這樣,那麼您可能沒有正確的管道選項。 –

+0

使用上面的配置選項設置暫存,這與Rails指南爲生產提供的內容相同。我想要幾乎相同的行爲。這是不對的? – cotopaxi

+0

應該沒問題。我會考慮更多... –

回答

0
config.assets.compile = false 

應該是:

config.assets.compile = true 

此外,確保清除緩存:

bundle exec rake tmp:cache:clear 

並重新啓動服務器。

+2

即時編譯資產導致更糟糕的表現。 – Maarten

0
config.assets.compile = false 

應該在其他的答案

config.assets.compile = true 

是真實的

1

儘管建議...是一種解決方法,而不是解決方案。這個選項使Rails能夠迴歸到在公共/資產中無法找到的資產的即時編譯。它可能在分階段「解決」你的問題,但在運行時Rails編譯資產在生產中並不是最佳的。

我記得在使用Rails 3.1.x中的新資產管道的最初幾個月裏,我在壓縮和生成摘要時遇到了問題,而這些問題在後續版本中只能真正解決。我會建議嘗試

config.assets.compress = false 
config.assets.digest = false 

單獨和一起。和/或升級到更高版本的Rails或資產管道寶石。

0

幾個月前我遇到了同樣的問題。出於幾個原因,我選擇手動觸發生產中的資產編譯,以便生產。的RB已經

config.assets.compile = false 

和Capistrano的部署也有一個任務預編譯的資產(使用RVM以及):

run "cd #{release_path} && RAILS_ENV=production bundle exec rake assets:precompile", shell: fetch(:rvm_shell) 

的最後一步是確保我們符號鏈接資產文件夾,以便我們不需要重新編譯沒有改變的資產。

run "ln -nfs #{shared_path}/assets #{release_path}/public/assets" 
1

如果您確定資產正在編譯並存在於公共目錄中,它可能是您的Web服務器設置嗎?在生產/臨時環境中,資產不應該碰到rails應用程序,而是直接從Web服務器提供。下面是一個示例apache配置代碼片段:

<LocationMatch "^/assets/.*$"> 
     Header unset ETag 
     FileETag None 
     # RFC says only cache for 1 year 
     ExpiresActive On 
     ExpiresDefault "access plus 1 year" 

     SetEnv no-gzip 
     RewriteEngine on 
     # Make sure the browser supports gzip encoding before we send it 
     RewriteCond %{HTTP:Accept-Encoding} \b(x-)?gzip\b 
     RewriteCond %{REQUEST_FILENAME}.gz -s 
     RewriteRule ^(.+) $1.gz [L] 

    </LocationMatch> 

    <FilesMatch \.css\.gz$> 
     ForceType text/css 
     Header set Content-Encoding gzip 
    </FilesMatch> 

    <FilesMatch \.js\.gz$> 
     ForceType text/javascript 
     Header set Content-Encoding gzip 
    </FilesMatch>