2009-10-10 10 views
29

में ओवरलोडेड विधि से बेस क्लास विधि को कॉल करना शायद मैं रूबी के लिए सही शब्दावली का उपयोग नहीं कर रहा हूं (और यदि मैं कृपया मुझे सही कर रहा हूं), लेकिन Google सिर्फ इस पर मेरी सहायता नहीं कर रहा है।उप-वर्ग

मेरे पास एक वर्ग है (इसे ऑर्डर कंट्रोलर कहते हैं) जो एक और वर्ग (इसे बेसस्टोर कंट्रोलर कहते हैं) बढ़ाता है। बेसस्टोर कंट्रोलर में मैंने before_filter परिभाषित किया है जिसका उपयोग मेरी ऑर्डर कंट्रोलर को छोड़कर छोटे से मेरी साइट पर किया जाता है। इस विशेष स्थिति में मुझे कस्टम before_filter को परिभाषित करने की आवश्यकता है जिसे कुछ अतिरिक्त तर्क करने की आवश्यकता है और फिर मेरे बेसस्टोर नियंत्रक में परिभाषित before_filter पर कॉल करें।

मुझे नहीं पता कि यह कैसे करना है।

यहाँ मैं क्या कोशिश की है है, लेकिन ऐसा लगता है 'सुपर' कीवर्ड क्या नहीं मैं इसे होने की उम्मीद कर रहा था यह है कि:

class BaseStoreController < ActionController::Base 
    before_filter :authorize 

    protected 
     def authorize 
      #common authroization logic here 
     end 
end 

और

class OrderController < BaseStoreController 
    before_filter :authorize 

    protected 
     def authorize 
      #additional authroization logic here 
      super.authorize 
     end 
end 

अंतिम परिणाम मेरे कोड का यह है कि ऑर्डर कंट्रोलर में प्राधिकरण विधि निम्न त्रुटि के साथ विफल रही है:

 
You have a nil object when you didn't expect it! 
The error occurred while evaluating nil.authorize 

उत्तर

56

क्या आपने कॉल करने का प्रयास किया है "super.authorize" के बजाय बेस क्लास की "authorize" विधि "super" विधि के साथ?

+2

वाह! मुझे लगता है कि अन्य भाषाओं के साथ मेरा अनुभव मुझे इस पर नुकसान पहुंचा रहा था ... मुझे उम्मीद है कि सुपर बेस क्लास के संदर्भ में होगा ... बेस क्लास विधि का संदर्भ नहीं जो मैं छुपा रहा था। यह एक आकर्षण की तरह काम किया, धन्यवाद! –

+3

रुबी में, 'सुपर' विधि के विरासत संस्करण के लिए एक कॉल है, इसलिए आप जो कुछ भी लौटाए उस पर 'अधिकृत' कह रहे थे - इस मामले में, 'शून्य'। –

+0

वास्तव में बेस क्लास का संदर्भ कैसे देगा? – Shayne

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