2011-08-11 16 views
5

Mam rubinowy klejnot, poirot, który umożliwia korzystanie z szablonów wąsów w Railsach. Obsługiwany szablon obsługiwałam od ActionView :: Template :: Handler, jednak wydaje się on być przestarzały w Rails 3.1.Handler szablonów Rails 3.1

Ponownie przeanalizowałem program obsługi, aby zachować zgodność z ostrzeżeniami o wycofaniu. W ten sposób nie jestem teraz w stanie przekazać do szablonu lokalnego lub kontekstu widoku. Nie mogę się dowiedzieć, jak to działa z 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 

W moim kodu powyżej do obsługi I przejdzie szablon, który jest instancją actionView :: Template. Ale nie jestem pewien, jak uzyskać kontekst widoku, który powinien obejmować miejscowych itp.

Czy ktoś może wskazać mi właściwy kierunek?

Odpowiedz

0

OK, mam rozwiązanie, nie jestem pewien, czy to jest najlepsze, to wydaje mi się trochę hacky!

moim zdaniem klasy I udało się uzyskać dostęp do miejscowych, wykonując następujące czynności:

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

to czuje się trochę brudny zarówno view_renderer i _partial_renderer są prywatne i nie ma właściwego accessor do miejscowi ivar.

Wciąż mam nadzieję, że jest lepszy sposób na zrobienie tego!

0

spędziłem około 4 godzin śledczych kod źródłowy, aby znaleźć rozwiązanie, a teraz to wydaje się bardzo prosta:

wystarczy dodać „local_assigns” gdzie jesteś chcą eval i używać.

Na przykład:

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

ten ciąg będzie evaluted wewnątrz kontekście modułu - ActionView::CompiledTemplates i local_assigns będą tam dostępne.