我有一个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。
答案 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
输出(正如您现在尝试的那样)