Шаблонные обработчики Rails 3.1 - PullRequest
5 голосов
/ 12 августа 2011

У меня есть рубиновый камень, poirot , который позволяет использовать шаблоны усов в Rails. Обработчик шаблонов, который у меня есть, был расширением ActionView :: Template :: Handler, однако в Rails 3.1 это выглядит устаревшим.

Я повторно обработал обработчик, чтобы выполнить предупреждения об устаревании. При этом я теперь не могу передать в шаблон локальные элементы или контекст представления. Я не могу понять, как заставить это работать с Rails 3.1.

module Poirot
  class Handler

    attr_reader :template

    def initialize(template)
      @template = template
    end

    def self.call(template, *args)
      self.new(template).call
    end

    def call
      view_path = "#{template.virtual_path}_view"
      abs_view_path = Rails.root.join('app/views', view_path)
      view_class = begin
        view_path.classify.constantize
      rescue NameError => e
        Poirot::View
      end
      "#{view_class}.new(self, '#{template.source.gsub(/'/, "\\\\'")}').render.html_safe"
    end
  end
end

В моем коде выше для обработчика я получил шаблон, который является экземпляром ActionView :: Template. Но я не уверен, как получить контекст представления, который должен включать местных жителей и т. Д.

Может ли кто-нибудь указать мне правильное направление?

Ответы [ 2 ]

0 голосов
/ 10 января 2012

Я потратил около 4 часов на изучение исходного кода, чтобы найти решение, и теперь оно кажется очень простым:

просто добавьте local_assigns там, где вы хотите его оценить и использовать.

Например:

"#{view_class}.new(self, '#{template.source.gsub(/'/, "\\\\'")}', local_assigns).render.html_safe"

эта строка будет оценена внутри контекста модуля - ActionView::CompiledTemplates и local_assigns будут там доступны.

0 голосов
/ 12 августа 2011

Ладно, у меня есть решение, я не уверен, что оно лучшее, мне оно кажется немного хакерским!

В моем классе просмотра мне удалось получить доступ к местным жителям, выполнив следующие действия:

locals = view_context.send(:view_renderer).send(:_partial_renderer).instance_variable_get("@locals") || {}

Это выглядит немного грязно, так как и view_renderer, и _partial_renderer являются приватными, и нет надлежащего доступа к локальным ivar.

Я все еще надеюсь, что есть лучший способ сделать это!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...