如何在轨道部分渲染sass?

我有一个Rails 3.2应用程序。 我试图在部分中渲染处理过的sass代码。

我添加了一个初始化程序来处理scss文件:

ActionView::Template.register_template_handler :scss, Sass::Rails::ScssTemplate 

我的sass文件名为_style.scss,渲染调用如下所示:

  

我收到以下错误:

 undefined method `call' for Sass::Rails::ScssTemplate:Class 

对我来说,这看起来像Rails不知道如何处理Sass文件,但是,我的application.css文件中包含的任何.scss文件都被正确处理,因此,至少在该上下文中,我知道sass处理工作。 我尝试了不同的扩展和格式。 在某些情况下,我可以获取渲染视图,但不处理sass。

我创建了一个帮助方法来执行此操作

 def render_scss(file) text = render("/amp/#{file}") view_context = controller.view_context engine = Sass::Engine.new(text, { syntax: :scss, cache: false, read_cache: false, style: :compressed, sprockets: { context: view_context, environment: view_context.assets_environment } }) raw engine.render end 

(注意:这包括能够处理sass中资产管道的sprockets上下文)。

然后你就这样调用它(scss保存在名为_amp.css.scss的同一目录中 – 不在资源目录中):

  

(显然这适用于scss – 但很容易改变以适用于sass)

 def render_sass(file) text = render("/amp/#{file}") view_context = controller.view_context engine = Sass::Engine.new(text, { syntax: :sass, cache: false, read_cache: false, style: :compressed, sprockets: { context: view_context, environment: view_context.assets_environment } }) raw engine.render end 

这种方法的问题在于它在运行时解析,但是这可以通过使用标准的Rails缓存来解决。

例如

 <% cache(my_object) do %>  <% end %> 

注意 :在大多数正常情况下,您需要将样式表保存在单独的文件中。 但是,可能存在不合适的情况。 例如,我正在使用这种技术来构建Google AMP页面,他们禁止将样式表放在单独的文件中。

解析

我认为问题可能与解析有关

当您调用部分内容时 ,Rails通常会尝试使用嵌入式erb代码在浏览器中呈现纯HTML 。 如果你试图以这种方式调用css文件,我只能认为Rails将无法以相同的方式处理css

正如评论中所提到的,我当然会使用stylesheet_link_tag ,因为这将指向HTML中的CSS文件(这就是浏览器处理此问题的方式)

如果你想输出 CSS本身,你必须在HTML文件中定义它然后使用partial输出(正如你现在尝试的那样)