Обработка файла двумя обработчиками шаблонов - PullRequest
3 голосов
/ 26 сентября 2011

Я использую 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

Однако, в этом случае source равно этому:

"@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"

и я не могу легко извлечь только «реальный источник».

Есть идеи, как это можно сделать?

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 21 августа 2012

Все, что вам нужно сделать, это вернуть строку, как это делает 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 mustбыть обернутым оператором begin-end.В противном случае это вызовет синтаксическую ошибку.

0 голосов
/ 26 сентября 2011

Разве Rails 3.1 Asset Pipeline уже не поддерживает стекирование препроцессоров?

http://asciicasts.com/episodes/279-understanding-the-asset-pipeline

...