2011-08-11 82 views
5

我有一個紅寶石寶石,poirot,它可以在Rails中使用小鬍子模板。我使用的模板處理程序是從ActionView :: Template :: Handler擴展而來的,但是這似乎在Rails 3.1中不推薦使用。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的一個實例。但我不知道如何獲得視圖上下文,其中應包括當地人等

有人可以指出我在正確的方向嗎?

回答

0

好吧我有一個解決方案,我不知道它是最好的,這感覺有點哈克我!

在我看來類我設法做以訪問當地人如下:

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

這感覺有點亂既是view_renderer和_partial_renderer是私有的,而且沒有適當的訪問器當地人伊娃。

我仍然希望有更好的方法來做到這一點!

0

我花了大約4個小時調查的源代碼,以找到一個解決方案,而現在它似乎很簡單:

,只需加上「local_assigns」你在哪裏要EVAL並使用。

例如:

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

這個字符串的模塊context中evaluted - ActionView::CompiledTemplateslocal_assigns將在那裏訪問。