2012-04-05 14 views
6

मुझे लगता है कि, नीचे उबला हुआ एक सिनात्रा एप्लिकेशन, इस तरह मूल रूप से दिखता है:एक मॉड्यूलर sinatra आवेदन के कॉन्फ़िगर ब्लॉक से कॉल करने के लिए एक विधि को परिभाषित करने के लिए कैसे?

class MyApp < Sinatra::Base 

    configure :production do 
    myConfigVar = read_config_file() 
    end 

    configure :development do 
    myConfigVar = read_config_file() 
    end 

    def read_config_file() 
    # interpret a config file 
    end 

end 

दुर्भाग्य से, यह काम नहीं करता। मुझे undefined method read_config_file for MyApp:Class (NoMethodError)

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

उत्तर

5

ऐसा लगता है कि configure ब्लॉक को फ़ाइल के रूप में निष्पादित किया जाता है।

class MyApp < Sinatra::Base 

    def self.read_config_file() 
    # interpret a config file 
    end 

    configure :production do 
    myConfigVar = self.read_config_file() 
    end 

    configure :development do 
    myConfigVar = self.read_config_file() 
    end 

end 
+0

शानदार! यह काम करता है। अब मुझे यह पता लगाने के लिए एक रूबी किताब पढ़नी है कि 'def methodname' और' def self.methodname' के बीच क्या अंतर है, जो मेरे लिए नया वाक्यविन्यास है। – Seldo

0

कक्षा परिभाषा का मूल्यांकन होने पर आपके कॉन्फ़िगरेशन ब्लॉक चलाए जाते हैं। तो, संदर्भ वर्ग है, उदाहरण नहीं। तो, आपको एक क्लास विधि की आवश्यकता है, उदाहरण विधि नहीं।

def self.read_config_file 

यह काम करना चाहिए। हालांकि परीक्षण नहीं किया है। ;)

+0

मैं का उपयोग कर 'self.read_config_file' बिल्कुल एक ही त्रुटि देता है डर लग रहा है: आप बस कॉन्फ़िगर ब्लॉक करने से पहले अपने विधि की परिभाषा ले जाते हैं, और यह एक वर्ग विधि में बदलने की जरूरत है। क्षमा करें, मुझे यह निर्दिष्ट करना चाहिए था कि मैंने पहले ही यह कोशिश की होगी :-) – Seldo

+0

अरे, मैं ** बहुत करीब ** था। दूसरा उत्तर देने वाला सही है। कक्षा परिभाषा को फ़ाइल के रूप में व्याख्या किया जाता है, और मुझे लगता है कि उन ब्लॉक को सिनात्रा द्वारा तुरंत निष्पादित किया जाता है, इसलिए आपको कॉन्फ़िगरेशन लाइन सेट अप करने से पहले क्लास विधि को परिभाषित करने की आवश्यकता होती है। –