2017-04-06 31 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 
相关问题