2017-04-06 68 views
1

我使用Sass :: Engine動態編譯css文件,並且需要將環境和加載路徑傳遞給鏈輪。這在開發工作得很好:生產環境中Rails.application.assets的等效內容是什麼?

def compile_scss 
    view_context = ActionView::Base.new 
    environment = Rails.application.assets 

    # body and filename are instance variables created elsewhere   
    @compiled_file = Sass::Engine.new(body, 
            filename: filename, 
            syntax: :scss, 
            cache: false, 
            load_paths: environment.paths, 
            sprockets: { 
             context: view_context, 
             environment: environment 
            }).render 
end 

,但在生產中失敗,因爲Rails.application.assetsnil。生產中的等價物是什麼?

+1

資源在編譯時從生產中的公用文件夾提供。 – bkunzi01

+0

@ bkunzi01感謝您的回覆。所以也許我在想它錯了?由於資源是預編譯的,並且由ngix提供服務,所以在生產中不需要Rails.application.assets。因此,也許我需要備份一下,看看資產:預編譯(可能?)如何初始化環境並嘗試複製它。 – sammms

+1

是的。通常,在運行「bundle exec rake assets:precompile RAILS_ENV = production」的預編譯資產時,通常會指定將用於編譯的環境配置文件。運行後,您會注意到它將用指紋資產填充公用文件夾。 – bkunzi01

回答

0

Rails.application.assets在生產中始終是nil,因爲資源是預編譯的並且來自公用文件夾(這歸功於@ bkunzi01)。此外,鏈輪只需要將資產路徑傳遞給它以運行,而不是環境。路徑可從Rails.application.config.assets.paths獲得。我能夠讓我的樣式表編譯器使用下面的方法。

def compile_scss 
    view_context = ActionView::Base.new 
    environment = Rails.application.assets || Rails.application.config.assets 

    # body and filename are instance variables created elsewhere   
    @compiled_file = Sass::Engine.new(body, 
            filename: filename, 
            syntax: :scss, 
            cache: false, 
            load_paths: environment.paths, 
            sprockets: { 
             context: view_context, 
            }).render 
end 
相關問題