加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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部分很简单:
(利用this stack overflow answer)

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读