2015-04-02 89 views
1

我使用的是DatetimepickerSlider。我有他們在我的Gemfile導軌資產沒有在生產中預編譯

gem 'datetimepicker-rails', github: 'zpaulovics/datetimepicker-rails', branch: 'master', submodules: true 
source 'https://rails-assets.org' do 
    # gem 'rails-assets-select2-bootstrap-css' 
    gem 'rails-assets-seiyria-bootstrap-slider' 
end 

在我application.js

//= require moment 
//= require bootstrap-datetimepicker 
//= require pickers 

//= require seiyria-bootstrap-slider 

這在發展的偉大工程,但是當我在服務器上運行RAILS_ENV=production rake assets:precompile(Capistrano的部署或手工),這些,和其他人不要」 t似乎被拉進來。Chrome首先特別抱怨這兩個。

我知道我可以把行Rails.application.config.assets.precompile += %w(*.js),然後做一個=javascript_include_tag :XXXX,但這失敗了鏈輪/清單權的目的?

我對鏈輪/清單的理解是,當我需要它在我的application.js中時,它將包含在部署中,以便客戶端少打擊服務器。

有什麼我失蹤了嗎?

編輯 追溯問題到uglifier寶石。當我刪除/註釋掉config.assets.js_compressor = :uglifier並重新編譯JS開始再次工作。

有什麼想法?

+1

如果你想從rail的'public'目錄提供靜態(預編譯)資產,請確保'config.serve_static_assets = true'。另一個可能的問題 - 默認情況下,您爲'development'運行'assets:precompile' - 指定例如'RAILS_ENV =生產耙子資產:預編譯' – AlkH 2015-04-02 10:19:04

+0

@AlkH,對不起,我應該說,這是在生產服務器上完成的,所以'RAILS_ENV = production'正在被應用。編輯文章 – nitsujri 2015-04-02 11:38:38

+0

你只在html中鏈接到application.js嗎?預編譯的application.js是否包含這兩個依賴關係? – 2015-04-02 12:00:44

回答

3

這是因爲與生產相比,事物在開發中的工作方式不同。 幾件事要注意: -

  1. 沒有CSS或JS文件將可以通過資產管道您的應用程序,除非它們包含在其他文件ORconfig.precompile directive.Only上市application.cssapplication.js可用默認情況下所有的CSS和JS文件。
  2. 當您編譯資產時,每個非應用程序/資產文件夾中的Javascript文件或CSS文件的文件將被Rails複製到public/assets文件夾中。因此,如果您要添加一些Web字體,可以創建應用程序/資產/字體/文件夾並將字體放入其中,然後在編譯資源時將這些文件複製到public/assets/fonts文件夾。請注意,您app/assets/stylesheets/fonts.css.scss文件引用這些字體將被複制,除非你要麼加入到config.assets.precompile指令或從application.css
  3. 需要它config.assets.compile ...如果它被設置爲「真」(它那麼Rails會嘗試通過首先查找public/assets目錄來查找Javascript或CSS文件,如果找不到它,將通過您的app/assets文件夾搜索以查找該文件。如果它在app/assets中找到它,它將繼續前進並在運行中編譯,然後提供此資產。

這裏的問題是,你不會注意到它的發展發生的事情,那麼你犯的一切,推動生產和繁榮,一切都與500錯誤的破裂是因爲生產config.assets.compile設置爲「假」 。這可以防止應用程序「回退」,並嘗試直接加載文件,而不是使用資產管道。

# Don't fallback to assets pipeline if a precompiled asset is missed 
config.assets.compile = false 

你爲什麼不只是有這個設置爲「true」在每一個環境?那麼,因爲它是sloooooow。而且你不想

  • 運行RAILS_ENV=production rake assets:clean assets:precompile
  • 檢查公共/資產目錄,並確認資產compiled..if它不是空的......這意味着緩慢的生產資產管道正在工作,但路徑不正確。使用asset_helpers設置CSS文件中資產的路徑。
  • +0

    有關路徑的補充 - 有時應用程序部署在某些路徑下,而不是'/' - 在這種情況下使用變量'RAILS_RELATIVE_URL_ROOT = $ prefix_path'來預編譯資產# – AlkH 2015-04-02 10:40:22

    +0

    對於#1,是不是我在'application.js'中說'// require require bootstrap-datetimepicker'所做的事情,這樣我就不必做'config.assets.compile = false'?此外,還記錄在生產服務器上(capistrano部署和手工在服務器上) – nitsujri 2015-04-02 11:41:52