2014-07-08 32 views
1

導軌4.1.1使用Apache /乘客配置爲運行在一個子目錄中rails應用程序「/ MyApp的」,而不是網站的根生產安裝。導軌4的應用程序中的子目錄 - 預編譯資產指向根,而不是子目錄

在應用做工精細的所有鏈接,但在生產中引用的SCSS文件的資產,例如

background-image: image-url('logo.png'); 

被編譯到:的

background-image: url("/assets/logo-<hash>.png"); 

代替:

background-image: url("/myapp/assets/logo-<hash>.png"); 

預編譯的資產,當我試圖做這樣的事情:

RAILS_ENV=production RAILS_RELATIVE_URL_ROOT=/myapp rake assets:precompile 

但沒有任何效果。

我也試過在config/environments/production.env文件中設置config.relative_url_root,沒有運氣。

Rails guides說要設置config.action_controller.relative_url_root,但這會導致缺少方法錯誤。

我最終放棄了和嵌入CSS文件的圖像通過:

background-image: asset-data-url('logo.png'); 

其作品,但只有通過完全避免子目錄問題。

我知道Rails使你付出不遵守約定,但有一個子目錄中的應用程序是不完全古怪。

我似乎已經在這個問題上的各種帖子,但很難得到一個直接的答案。對於Rails的早期版本,似乎已經修復了幾次,但是不清楚這些修復是否進入了標準的Rails發行版。

回答

0

將jquery-ui-rails gem添加到部署在子目錄中的另一個應用程序後,我對jQuery UI內置的CSS所引用的資產也有同樣的問題。我拒絕修改第三方CSS文件來解決這個問題,特別是因爲Rails似乎正確地處理了所有的路徑(資產路徑除外)。

把我的頭髮拉出一段時間後,我不知道是什麼促使我重新運行rake資源:預編譯任務完全按照給定的here。令我驚訝的是,一切都很完美,包括我自己的圖片網址和jQuery UI。

有什麼不同?如果我從應用程序的bin文件夾中調用rake腳本(如下所示),則所有資產URL都會錯誤地構建,而不包含子目錄。

RAILS_ENV=production RAILS_RELATIVE_URL_ROOT=/myapp bin/rake assets:precompile 

如果代替我運行經由束EXEC耙,如下,正確地產生的所有資產路徑,包括子目錄。

RAILS_RELATIVE_URL_ROOT=/myapp RAILS_ENV=production bundle exec rake assets:precompile 

至於爲什麼會發生這種情況,我只能得出結論,運行bin/rake不會加載正確的寶石。

2

在我們的例子中,我們能夠做出兩個改變,這似乎爲我們工作中的Rails 4.1.6:

1)在application.rb中,假設有一個名爲「MyAppName < Rails的模塊::應用」。在這裏,我們有

config.relative_url_root = "/myapp" 

2)在config.ru:

map MyAppName::Application.config.relative_url_root || "/" do 
    run Rails.application 
end 

沒有config.ru更新時,事情就無法正常工作。

+0

我道歉;直到現在我還沒有能夠測試這個。修改config/application.rb和config.ru並運行'rake assets:precompile'後,重新啓動服務器後,每次請求都會得到** 404 Not Found **(並且沒有任何內容會寫入生產日誌。是很多移動部件(SSL,Apache/mod_passenger),所以也許它與Rails本身無關。但是,恢復更改會使應用程序再次工作。 – EK0

+0

哇......不知道爲什麼這不在文檔中http://guides.rubyonrails.org/configuring.html#deploy-to-a-subdirectory-relative-url-root ...以防其他人想知道,你可以通過使用'RAILS_RELATIVE_URL_ROOT刪除config.relative_url_root 'env var - 但你仍然需要做cmonkeys步驟2) –