2011-09-25 11 views
8

के अंदर नियंत्रक विधि या आवृत्ति परिवर्तक मैं थोड़ा मणि का उपयोग कर रहा हूं और अपने सहायक तरीकों के अंदर थोड़ा सा एपीआई तक पहुंच प्राप्त करना चाहता हूं (जो यूआरएल उत्पन्न करने के लिए विचारों और मेलर्स द्वारा बुलाया जाता है)।रेल: एक सहायक

मैं अपने ApplicationController में इस विधि में एक API कनेक्शन आरंभ:

(इस BTW करने के लिए एक अधिक उपयुक्त जगह है?)

class ApplicationController < ActionController::Base 
    before_filter :bitly_connect 

    def bitly_connect 
    Bitly.use_api_version_3 
    @bitly ||= Bitly.new(APP_CONFIG['bitly_username'], APP_CONFIG['bitly_api_key']) 
    end 
end 

डिफ़ॉल्ट रूप से मैं @bitly लिए पहुँच नहीं है मेरे सहायकों में क्या आप इसे पूरा करने का एक तरीका सुझा सकते हैं?

केवल संबंधित धागा मैंने पाया सहायक नहीं था: Rails 3 and Controller Instance Variables Inside a Helper

धन्यवाद।

उत्तर

9

सम्मेलन द्वारा रेल दृश्यों के साथ नियंत्रक क्रियाओं (और फ़िल्टर) में सेट आवृत्ति चर पास करता है। सहायक विचार इन विचारों में उपलब्ध हैं, और आपके नियंत्रक कार्रवाई के अंदर सेट किए गए इंस्टेंस वेरिएबल्स तक पहुंच होनी चाहिए।

वैकल्पिक रूप से, आप विधि के लिए चर उत्तीर्ण करके सहायक विधि के अंदर एक स्थानीय चर सेट कर सकते हैं, या वस्तु # instance_variable_get विधि का उपयोग कर: http://ruby-doc.org/core/classes/Object.html#M001028

# app/controllers/example_controller.rb 
class ExampleController 
    def index 
    @instance_variable = 'foo' 
    end 
end 

# app/helpers/example_helper.rb 
module ExampleHelper 
    def foo 
    # instance variables set in the controller actions can be accessed here 
    @instance_variable # => 'foo' 
    # alternately using instance_variable_get 
    variable = instance_variable_get(:@instance_variable) 
    variable # => 'foo' 
    end 
end 

की नियुक्ति के साथ अपनी चिंताओं का सवाल है तर्क, ऐसा लगता है कि यह नियंत्रक में संबंधित नहीं है। अपने आवेदन के लिए रूटिंग अनुरोध के रूप में नियंत्रक के बारे में सोचें। अधिकांश तर्क आपके मॉडल वर्गों के अंदर किया जाना चाहिए। "स्किनी नियंत्रक, वसा मॉडल।": http://weblog.jamisbuck.org/2006/10/18/skinny-controller-fat-model

2

आप एक नियंत्रक विधि की जरूरत है एक सहायक के रूप सुलभ होने के लिए, आप उपयोग कर सकते helper_method

class ApplicationController < ActionController::Base 
    helper_method :bitly_connect 

    def bitly_connect 
    @bitly ||= begin 
     Bitly.use_api_version_3 
     Bitly.new(APP_CONFIG['bitly_username'], APP_CONFIG['bitly_api_key']) 
    end 
    end 
end 

ध्यान दें कि मैं भी विधि को इतना बदल ऐसा नहीं प्रत्येक बार इसे कॉल करने पर Bitly.use_api_version_3 पर कॉल न करें।

जैसा कि बेन सिम्पसन ने नोट किया था, आपको शायद इसे मॉडल में ले जाना चाहिए।

संबंधित मुद्दे