2011-09-26 75 views
3

我正在使用Rails 3.1,并试图用两个模板处理程序处理文件。由两个模板处理程序处理文件

那么,我已经为.scss文件注册了一个新的模板处理程序。现在要处理这样的一个文件:

应用程序/视图/ custom_css/stylesheet.css.scss.erb

通过2个模板处理程序。第一个ERB和之后的SCSS。这样我们就可以拥有动态的scss文件。

我想这个模板处理程序:

class ActionView::Template::Handlers::Sass 

    def initialize options = {} 
    @options = options 
    end 

    def erb_handler 
    @erb_handler ||= ActionView::Template.registered_template_handler(:erb) 
    end 

    def call template 
    source = erb_handler.call(template) 

    <<CODE 
compiler = Compass::Compiler.new *Compass.configuration.to_compiler_arguments 
options = compiler.options.merge(#{@options.inspect}) 
Sass::Engine.new(source, options).render 
CODE 
    end 
end 

然而,在这种情况下等于这个:

"@output_buffer = output_buffer || ActionView::OutputBuffer.new;@output_buffer.safe_concat('$background_color: \"#ff0000\";\n\n$test: ');@output_buffer.append= ('test');@output_buffer.safe_concat(';\n\n.container {\n background-color: $background_color;\n}\n');@output_buffer.to_s" 

,我不能轻易只提取 “的真正来源。”

任何想法如何做到这一点?

预先感谢您!

+1

您是否找到解决方案?因为我试图做这样的事情,但我无法得到“真正的”来源。 – basgys

回答

0

所有你需要做的就是回到就像ERB做一个字符串。

这里是我的处理程序,其内嵌的CSS代码:

module EmvHandler 
    def self.erb_handler 
     @@erb_handler ||= ActionView::Template.registered_template_handler(:erb) 
    end 

    def self.call(template) 
     compiled_source = erb_handler.call(template) 
     options = { 
      :warn_level => Premailer::Warnings::SAFE, 
      :with_html_string => true 
     } 
     "Premailer.new((begin;#{compiled_source};end), #{options}).to_inline_css" 
    end 
end 

compiler_source必须由开始-end语句包裹。否则会引发语法错误。