2011-08-11 10 views
5

私はルビーの宝石、poirotを持っており、Railsで口髭のテンプレートを使用することができます。私が持っているテンプレートハンドラはActionView :: Template :: Handlerから拡張されていましたが、これはRails 3.1では廃止されているようです。Rails 3.1テンプレートハンドラ

私は、廃止の警告に従うようにハンドラを再調整しました。これで、私は現在、地元の人々やビューのコンテキストをテンプレートに渡すことができません。私はこれをRails 3.1でどのように動作させるかを見出すことができません。私はActionViewのインスタンス::テンプレートでテンプレートを、渡されるハンドラのための上記の私のコードで

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 

。しかし、私はどのように地元の人々を含むべきビューのコンテキストを取得するか分からない

誰かが正しい方向に私を指すことができますか?

答えて

0

私は解決策を持っています、私はそれが最高であるとは確信していません、それは私に少しハッキリ感じている!

私は次の操作を行って、地元の人々へのアクセスを得るために管理している私のビュークラスで

:view_rendererと_partial_rendererの両方がプライベートであり、への適切なアクセサがないよう

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

これは少し厄介に感じています地元の象牙。

私はまだこれを行うより良い方法があると思っています!

0

私は解決策を見つけるために、ソースコードを調査し、約4時間を費やし、今ではだ、非常に単純なようだ:

ちょうどあなたがそれを評価および使用したい「local_assigns」を追加します。

例えば

:この文字列は、モジュールコンテキスト内部evalutedする

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

- ActionView::CompiledTemplateslocal_assignsがアクセスできるようになります。