ruby-on-rails – 通过链轮动态渲染sass文件
发布时间:2020-12-17 03:49:41 所属栏目:百科 来源:网络整理
导读:我希望,从帮助器,在.scss.erb模板中渲染一些使用image-url()sass函数的变量: // template.scss.erb#%= id % { background-image: image-url('%= image_file %');} 到目前为止,ERB部分很简单: (利用this stack overflow answer) vars_binding = OpenStruct.
我希望,从帮助器,在.scss.erb模板中渲染一些使用image-url()sass函数的变量:
// template.scss.erb #<%= id %> { background-image: image-url('<%= image_file %>'); } 到目前为止,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上下文中呈现此模板呢? 解决方法
在挖掘了一个
similar question,以及大量的试验和错误后,我找到了我的解决方案:我在调用Sass :: Engine.new时必须提供:sprockets哈希.
css = Sass::Engine.new( rendered_sass,style: :compressed,# The key ingredient… sprockets: { context: view_context,environment: view_context.assets } ).render 应该注意的是view_context是从视图文件传递的,但它也可能是ActionView :: Base.new (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |