通过链轮动态渲染sass文件

我希望,从帮助器,在.scss.erb模板中渲染一些变量,使用image-url() sass函数:

 // template.scss.erb # { background-image: image-url(''); } 

到目前为止,ERB部分很简单:
(利用这个堆栈溢出答案 )

 vars_binding = OpenStruct.new( id: 'foo', image_file: 'foo.jpg' ).instance_eval { binding } template = File.read('path/to/template.scss.erb') rendered_sass = ERB.new(template).result(vars_binding) 

运行该代码, sass现在等于:

 #foo { background-image: image-url('foo.jpg'); } 

但是,当我下次尝试运行时:

 css = Sass::Engine.new( rendered_sass, syntax: :scss, cache: false, load_paths: view_context.assets.paths, read_cache: false, style: :compressed ).render 

它回来了

 NoMethodError: undefined method `[]' for nil:NilClass from …/sprockets-3.2.0/lib/sprockets/sass_processor.rb:267:in `sprockets_context' 

因为对Sass::Engine的调用不提供Sprockets上下文。

如果我从.scss.erb模板中删除image-url() ,并将其替换为本机url() ,它将正确地呈现为CSS,没问题。

那么如何在sprockets上下文中呈现此模板呢?

在深入研究了类似的问题 ,以及大量的反复试验后,我找到了解决办法:在调用Sass::Engine.new时,我必须提供:sprockets哈希。

 css = Sass::Engine.new( rendered_sass, syntax: :scss, cache: false, load_paths: view_context.assets.paths, read_cache: false, style: :compressed, # The key ingredient… sprockets: { context: view_context, environment: view_context.assets } ).render 

应该注意的是view_context是从视图文件传递的,但它也可能是ActionView::Base.new

在努力解决同样的问题后,我在Github页面上找到了相同function的实例,令人惊讶的是没有创作。

https://github.com/BLauris/custom-css-for-user

有一篇文章解释了这个链接的方法: http : //www.diatomenterrenren/dynamically-compile-stylesheets-with-rails-and-sass/