2015-04-07 66 views
3

我剛剛部署了我的應用程序的Heroku,我有很多的麻煩試圖讀取部分資產軌道4:errno的:: ENOENT(沒有這樣的文件或目錄@ rb_sysopen - /資產/

。 。我試圖動態加載多個文件的某些CSS,然後用一些修改後重新編譯他們繼續違反行是第一個文件加載:

@css_asset_bootstrap = File.open(ActionController::Base.helpers.asset_path('bootstrap.css'), "r").read 

生成該錯誤:

2015-04-07T23:30:50.098831+00:00 app[web.1]: Errno::ENOENT (No such file or directory @ rb_sysopen - /assets/bootstrap-2d25733981c30e34bd9aa0fb75388f08.css): 

我試過了其中包括將所有資產移動到雲端。有沒有辦法解決這個問題?在開發環境中完美工作。

只是爲了確認一些事情。我已經成功預編譯並上傳了該文件。該文件肯定存在,因爲我可以看到它

heroku run bash 
cd /public/assets/ 

我也可以看到它時,我將資產移動到cloudfront。

謝謝。

編輯1: 不知道這是很重要的信息,但對CloudFront的文件,我可以運行的Heroku運行bash的,以在Heroku上啓動一個shell會話。然後我可以:

curl http://xxx.cloudfront.net/assets/bootstrap-2d25733981c30e34bd9aa0fb75388f08.css 

並獲取文件確定。我想也許這是一個權限錯誤,但一切都設置爲公開,它似乎都從heroku工作到aws服務器。

+0

假設問題是因爲在dev env中沒有默認的動作控制器緩存,這就是爲什麼它在dev中工作,而沒有在任何其他env中打開緩存的原因。問題似乎是重新編譯資產時的摘要更改,但「@ css_asset_bootstrap」不會重新運行並指向相同的舊資產導致錯誤。嘗試在每次編譯後更新'@ css_asset_bootstrap'的值。 – vee

+0

感謝您的評論vee。錯誤中的摘要與資產目錄中的摘要相同。如果是緩存,錯誤是不是會拋出舊的文件摘要而不是當前的文件摘要? 服務器上的文件是自舉2d25733981c30e34bd9aa0fb75388f08.css –

+0

資產也可以使用'HTTP訪問:// myapp.herokuapp.com /資產/自舉2d25733981c30e34bd9aa0fb75388f08.css' –

回答

3

您正在從相對路徑請求文件,這可能並不總是奏效。嘗試絕對:

@css_asset_bootstrap = File.open(Rails.root + ActionController::Base.helpers.asset_path('bootstrap.css'), "r").read 

另一個可能更大的問題是Heroku上有一個短暫的文件系統,所以你寫它的任何變化可以在任何時候賽道被撲殺被磨滅。

+0

謝謝您的回答jemminger。我只是試過你的解決方案,但仍然有相同的錯誤。實際上,我嘗試使用'「xxx.cloudfront.net#{ActionController :: Base.helpers.asset_path('bootstrap.css')}」'在之前的絕對路徑中添加了cloudfront,但這也沒有奏效。即使我可以將錯誤地址(無此類文件)直接複製並粘貼到瀏覽器中,然後查看該文件! 關於臨時文件系統的好處,雖然我現在不擔心它。我稍後在代碼中動態創建一個臨時文件並將其上傳到aws S3,它應該是靜態的。 –

+1

你不能用vanilla'File.open'打開一個遠程文件,你必須使用'open-uri':http://ruby-doc.org/stdlib-2.1.0/libdoc/open -uri/rdoc/OpenURI.html – jemminger

+0

沒錯,就是這樣。 open-uri就是答案。謝謝。 –

0

在我的情況下,使用虛擬機Rails.root給我這個:'/home/vagrant/projects/.../my-nice-app'什麼是完全uncool。

我改用request.url給我:'http://localhost:3000/'它究竟是什麼我想要的。

相關問題