2011-08-11 15 views
5

मेरे पास एक रूबी मणि, poirot है, जो रेल में मूंछ टेम्पलेट्स के उपयोग को सक्षम बनाता है। टेम्पलेट हैंडलर मैं एक्शन व्यू :: टेम्पलेट :: हैंडलर से विस्तार कर रहा हूं, हालांकि यह रेल 3.1 में बहिष्कृत प्रतीत होता है।रेल 3.1 टेम्पलेट हैंडलर

मैंने बहिष्करण चेतावनियों का अनुपालन करने के लिए हैंडलर को फिर से पहचाना है। ऐसा करने में मैं अब टेम्पलेट में स्थानीय, या दृश्य संदर्भ पारित करने में असमर्थ हूं। मुझे यह पता लगाना प्रतीत नहीं होता कि यह रेल 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 

हैंडलर के लिए उपरोक्त मेरे कोड में मैं टेम्पलेट पास कर चुका हूं, जो एक्शन व्यू :: टेम्पलेट का एक उदाहरण है। लेकिन मुझे यकीन नहीं है कि व्यू संदर्भ कैसे प्राप्त करें, जिसमें स्थानीय लोगों को शामिल करना चाहिए

क्या कोई मुझे सही दिशा में इंगित कर सकता है?

उत्तर

0

ठीक है मेरे पास एक समाधान है, मुझे यकीन नहीं है कि यह सबसे अच्छा है, यह मुझे थोड़ा हैकी लगता है!

मेरे विचार वर्ग में मैं निम्न कार्य करके स्थानीय लोगों के लिए पहुँच प्राप्त करने में कामयाब रहे:

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

यह दोनों view_renderer और _partial_renderer के रूप में एक छोटे से गंदा निजी हैं लगता है, और वहाँ के लिए कोई उचित एक्सेसर है स्थानीय ivar।

मुझे अभी भी उम्मीद है कि ऐसा करने का एक बेहतर तरीका है!

0

मैं स्रोत कोड की जांच कर एक समाधान खोजने के लिए लगभग 4 घंटे बिताए, और अब यह बहुत आसान लगता है, है:

बस "local_assigns" जहां आप इसे eval और उपयोग करना चाहते हैं जोड़ें।

उदाहरण के लिए:

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

इस स्ट्रिंग मॉड्यूल संदर्भ अंदर evaluted किया जाएगा - ActionView::CompiledTemplates और local_assigns वहाँ पहुंचा जा सकेगा।