2011-08-11 27 views
5

Tôi có đá quý ruby, poirot, cho phép sử dụng các mẫu ria mép trong Rails. Trình xử lý mẫu mà tôi đã mở rộng từ ActionView :: Template :: Handler, tuy nhiên điều này dường như không được chấp nhận trong Rails 3.1.Rails 3.1 trình xử lý mẫu

Tôi đã xác thực lại trình xử lý để tuân thủ cảnh báo không dùng nữa. Trong khi làm điều này tôi bây giờ không thể vượt qua người dân địa phương, hoặc bối cảnh xem, để các mẫu. Tôi không thể tìm ra cách để làm việc này với 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 

Trong mã của tôi ở trên cho trình xử lý tôi nhận được mẫu, ví dụ mẫu ActionView :: Mẫu. Nhưng tôi không chắc chắn làm thế nào để có được bối cảnh xem, mà nên bao gồm người dân địa phương vv

Ai đó có thể chỉ cho tôi đi đúng hướng không?

Trả lời

0

Được rồi, tôi có một giải pháp, tôi không chắc nó là tốt nhất, nó cảm thấy một chút hacky với tôi!

Trong lớp quan điểm của tôi tôi đã được quản lý để có được quyền truy cập vào người dân địa phương bằng cách làm như sau:

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

này cảm thấy một chút lộn xộn như cả view_renderer và _partial_renderer là riêng tư và không có accessor thích hợp để các người dân địa phương ivar.

Tôi vẫn hy vọng có cách tốt hơn để thực hiện việc này!

0

Tôi đã dành khoảng 4 tiếng đồng hồ điều tra mã nguồn để tìm một giải pháp, và bây giờ nó có vẻ rất đơn giản:

chỉ cần thêm "local_assigns" bạn đang ở đâu muốn eval nó và sử dụng.

Ví dụ:

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

chuỗi này sẽ được evaluted bên trong bối cảnh mô-đun - ActionView::CompiledTemplateslocal_assigns sẽ có thể truy cập đó.

Các vấn đề liên quan