2015-05-21 40 views
3

我正在使用以下代码片段手动编译带有一些变量覆盖的sass清单。Rails-如何在手动sass编译中传递Sprockets :: Context

template = File.read("#{Rails.root}/app/assets/schemes/#{scheme}/css/styles.css.scss") 

scheme_variables.each do |key, value| 
    template << "$#{key}:#{value};\n" 
end 

engine = Sass::Engine.new(template, { 
    :syntax => :scss, 
    :cache => false, 
    :read_cache => false, 
    :style => :compressed, 
    :filesystem_importer => Sass::Rails::SassImporter, 
    :load_paths => MyApp::Application.assets.paths, 
    :sprockets => { 
    :context => ?, 
    :environment => MyApp::Application.assets 
    } 
}) 
output = engine.render 

Sass :: Engine构造函数需要选项哈希中的链轮上下文和环境。我在上下文中放置了什么?我想的第一件事是...

:context => MyApp::Application.assets.context_class, 

...但是这给了我下面的错误“未定义的方法`font_path”为#”,当它击中我的青菜资产的助手之一。

我试过的第二件事是...

:context => ActionController::Base.helpers, 

...这固定的资产助手的问题,但引发以下错误“未定义的方法`depend_on”为#”,当它试图通过工作我的glob导入(例如@import“mixins/*”)。

我使用Rails 4.2和sass-rails 5.0.3。

任何意见,将不胜感激。谢谢!

回答

3

我最终以稍微不同的方式解决了这个问题 - 使用Sass :: Rails :: ScssTemplate的render方法。基本上,我把我的改变后的css字符串写到一个文件中,并将它传递给Sass :: Rails :: ScssTemplate构造函数。我完成后编译并删除临时文件。这感觉不太好,但对我来说效果很好。

scheme_css_dir = "#{Rails.root}/app/assets/schemes/#{scheme}/css" 
css = File.read("#{scheme_css_dir}/styles.css.scss") 

variables_str = '' 
scheme_variables.each do |key, value| 
    variables_str << "$#{key}:#{value};\n" 
end 

css.gsub!('@import "./variables";', variables_str) 

file = Tempfile.new(['styles', '.css.scss'], scheme_css_dir) 
file.write(css) 
file.close 

abs_path = file.path 
relative_path = abs_path[Rails.root.to_s.size + 1..-1] 

template = Sass::Rails::ScssTemplate.new(abs_path) 
environment = Evrconnect::Application.assets 
context = environment.context_class.new(
    :environment => environment, 
    :name => relative_path, 
    :filename => abs_path, 
    :metadata => {} 
) 
output = template.render(context) 

file.unlink 
+0

我想在[我的问题](http://stackoverflow.com/questions/30676993/dynamically-render-a-sass-file-through-sprockets)做同样的事情 - 你弄清楚如何要做到这一点,而不创建一个tmp文件? – elstgav

3

随着使用的Sass :: Rails的:: ScssTemplate可以渲染在这个片段中您的青菜代码:

template = '...' # Your sass code 

logical_path = pathname = '' 
environment = Rails.application.assets 
context = environment.context_class.new(environment, logical_path, pathname) 

template = Sass::Rails::ScssTemplate.new(pathname) { template } 
output = template.render(context, {}) 

如果你想从一个文件来渲染然后就其路径添加到路径并将其资产路径指向logical_path。

对我来说,它适用于Rails 4.2.5.1和sass-rails 5.0.4。