经过漫长的一天,感谢 John Feminella 和他在 google 上的帖子,我能够解决我的问题。对我来说具有挑战性的部分是弄清楚如何创建一个新的 Sprockets::Context。幸运的是,John 的解决方案不需要上下文。
此处更新要点
尝试#1
此代码不允许从资产管道导入 css 文件。
@import "foundation";
有效,因为基础作为指南针模块加载
@import "custom_css";
导致错误消息提示找不到文件
def call(template)
erb = ActionView::Template.registered_template_handler(:erb).call(template)
%{
options = Compass.configuration.to_sass_engine_options.merge(
:syntax => :scss,
:custom => {:resolver => ::Sass::Rails::Resolver.new(CompassRails.context)},
)
Sass::Engine.new((begin;#{erb};end), options).render
}
end
尝试#2
此代码无法使用asset-data-url 嵌入base64 url
def call(template)
erb = ActionView::Template.registered_template_handler(:erb).call(template)
%{
compiler = Compass::Compiler.new *Compass.configuration.to_compiler_arguments
options = compiler.options.merge({
:syntax => :scss,
:custom => {:resolver => ::Sass::Rails::Resolver.new(CompassRails.context)},
})
Sass::Engine.new((begin;#{erb};end), options).render
}
end
尝试 3
事实证明,您可以在创建上下文时使用空值。下面的代码在开发中工作,但在生产中引发错误。
ActionView::Template::Error (can't modify immutable index)
似乎错误发生在 Sprockets::Index 中,它在生产中用于代替 Sprockets::Environment。切换到 Sprockets::Environment 也不能解决问题。
def call(template)
erb = ActionView::Template.registered_template_handler(:erb).call(template)
%{
context = CompassRails.context.new(::Rails.application.assets, '', Pathname.new(''))
resolver = ::Sass::Rails::Resolver.new(context)
compiler = Compass::Compiler.new *Compass.configuration.to_compiler_arguments
options = compiler.options.merge({
:syntax => :scss,
:custom => {:resolver => resolver}
})
Sass::Engine.new((begin;#{erb};end), options).render
}
end