2010-01-07 7 views
9

मैं नीचे structore का उपयोग कर एक रेल सहायक है में एक कक्षा में LINK_TO का उपयोग करते हुए, लेकिन जब मैं इसका इस्तेमाल मैं संदेशएक रेल सहायक

undefined method 'link_to' 

सहायक के रूप में व्यवस्थित किया गया मिलता है:

module MyHelper 

    class Facet 

    def render_for_search 
     link_to("Value", params) 
    end 
    end 

    class FacetList 
    attr_accessor :facets 

    def initialize 
     #Create facets 
    end 

    def render_for_search 
     result = "" 
     facets.each do |facet| 
     result << facet.render_for_search 
     end 
     result 
    end 
    end 
end 

उत्तर

3

ऐसा इसलिए है क्योंकि क्लास फ़ेसेट के भीतर आपके पास टेम्पलेट बाइंडिंग तक पहुंच नहीं है। आदेश विधि कॉल करने में आप शायद कुछ की तरह

<%= Facet.new.render_for_search %> 

बस तर्क के रूप में वर्तमान संदर्भ लेने के लिए अपने initialize विधि ओवरराइड करते हैं। वही पैरा हैश पर लागू होता है।

class Facet 
    def initialize(context) 
    @context = context 
    end 
    def render_for_search 
    @context.link_to("Value", @context.params) 
    end 
end 

फिर

<%= Facet.new(self).render_for_search %> 

अन्यथा कहते हैं, MyHelper मॉड्यूल के भीतर सीधे विधि को परिभाषित करने और एक वर्ग में लपेट नहीं है।

+0

यह एक मामूली परिवर्तन के साथ काम करता है। दृश्य में मुझे <% = MyHelper :: Facet.new (self) .render_for_search%> करना था –

6

इस उपयोग करके देखें:

self.class.helpers.link_to 

क्योंकि LINK_TO अपने वर्तमान क्षेत्र में परिभाषित नहीं है।

उपर्युक्त नियंत्रक के लिए काम करेगा, लेकिन मुझे लगता है कि यह एक और सहायक के अंदर भी काम करेगा। यदि नहीं, तो कोशिश करें:

include ActionView::Helpers::UrlHelper 

अपने सहायक के शीर्ष पर।

+0

यह काम नहीं करेगा क्योंकि 'पैराम्स' कक्षा के दायरे में परिभाषित नहीं किया गया है। –

+1

आप जहां भी कहलाते हैं, वहां से अपने सहायक विधि के लिए 'पैरा' (या उदाहरण के लिए केवल एक पैरामेट '(उदाहरण के लिए] के माध्यम से एक विशेष परम पारित कर सकते हैं, यानी' def render_for_search (params) 'जो विधि को लागू करने के लिए विधि को लागू करता है। –