如何在轨道部分渲染sass?

时间:2014-07-04 03:50:47

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2 sass

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

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

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

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

<%= render partial: "./templates/default/style", formats: "css" %>

我收到以下错误:

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

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

2 个答案:

答案 0 :(得分:1)

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

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的同一目录中的部分内容中 - 不在资源目录中):

<style>
  <%= render_scss("amp.css.scss") %>
</style>

(显然这适用于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缓存来解决。

e.g。

<% cache(my_object) do %>
  <style>
    <%= render_scss("amp.css.scss") %>
  </style>
<% end %>

注意:在大多数正常情况下,您都希望将样式表保存在单独的文件中。但是,可能存在这种情况并非适当的情况。例如,我使用这种技术构建Google AMP页面,禁止样式表位于单独的文件中。

答案 1 :(得分:0)

<强>解析

我认为问题可能与解析

有关

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

-

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

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