Ruby on rails 通过链轮动态渲染sass文件

Ruby on rails 通过链轮动态渲染sass文件,ruby-on-rails,sass,sprockets,Ruby On Rails,Sass,Sprockets,我想从助手那里,在.scss.erb模板中呈现一些变量,该模板使用image-url()sass函数: // template.scss.erb #<%= id %> { background-image: image-url('<%= image_file %>'); } 运行该代码时,sass现在等于: #foo { background-image: image-url('foo.jpg'); } 但是,当我下次尝试运行时: css=Sass::Eng

我想从助手那里,在
.scss.erb
模板中呈现一些变量,该模板使用
image-url()
sass函数:

// template.scss.erb

#<%= id %> {
  background-image: image-url('<%= image_file %>');
}
运行该代码时,
sass
现在等于:

#foo {
  background-image: image-url('foo.jpg');
}
但是,当我下次尝试运行时:

css=Sass::Engine.new(
他说,,
语法::scss,
cache:false,
加载路径:查看上下文.assets.path,
读缓存:false,
样式::压缩
).渲染
它回来了

NoMethodError: undefined method `[]' for nil:NilClass
from …/sprockets-3.2.0/lib/sprockets/sass_processor.rb:267:in `sprockets_context'
因为对
Sass::Engine
的调用不提供链轮上下文

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

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

在深入研究了大量的尝试和错误后,我找到了解决方案:调用
Sass::Engine.new
时,我必须提供
:sprockets
哈希

css=Sass::Engine.new(
他说,,
语法::scss,
cache:false,
加载路径:查看上下文.assets.path,
读缓存:false,
样式::压缩,
#关键的成分…
链轮:{
上下文:查看上下文,
环境:查看上下文资源
}
).渲染

应该注意的是,
view\u context
是从一个视图文件传递的,但它也可能是
ActionView::Base。new

在解决了同样的问题后,我在Github页面上发现了一个相同功能的实例,令人惊讶的是,它没有被复制

有一篇作者的文章解释了这个链接的方法:

谢谢!还有一件事我正在努力解决,那就是我想让
image-url()
SASS助手生成绝对路径。有什么想法吗?你能提供更多关于视图上下文的信息吗?在尝试调用ActionView::Base实例上的#assets时,我遇到了一个无方法错误。我确信这已经接近我所需要的了,但我真的不明白链轮上下文在这里做什么。@sammms不是在
view\u context
上调用
assets
,而是在
Rails.application
上调用它,对于最新版本的Rails,您需要在
应用程序中设置
config.assets.compile=true
。rb
,否则
资产在生产中将
nil
。更多信息请访问