通过链轮动态渲染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/