2011-11-22 9 views
7

मुझे अपने मार्गों को कॉल करते समय लापता उदाहरणों और nilClass त्रुटियों के साथ कोई समस्या हो रही है। स्रोत के चारों ओर घूमने के बाद ऐसा लगता है कि gener_method कॉल मूल रूप से प्रारंभिक विधि के ब्लॉक का उपयोग करके एक नई विधि बनाता है।सिनात्रा के मार्ग विधियों में संदर्भ की कमी के आसपास काम करना

get "/" do 
    @some_local_instance.do_something() 
end 

तो उपरोक्त विधि में वहाँ बहुत अच्छी तरह से है कि वर्ग कहा जाता some_local_instance के भीतर एक स्थानीय चर, हो सकता है लेकिन जब रटना वास्तव में मूल्यांकन किया जाता है यह जहां विधि परिभाषित किया गया था के रूप में कोई संदर्भ है, इसलिए यह असफल हो जायेगी।

कारण मैं पूछता हूं क्योंकि मेरी लिपि के हिस्से के रूप में मेरे पास बाहरी कक्षाएं हैं जो सिनात्रा लोड होने पर लोड की जाती हैं और जब उन मार्गों को बुलाया जाता है तो मुझे इन कक्षाओं पर कुछ स्थानीय चरों तक पहुंचने की आवश्यकता होती है। एक उदाहरण होगा:

class SomeRouteClass 
    def initialize(sinatra, calculator) 
     @calculator = calculator 
     @sinatra = sinatra 
    end 

    def setup_routes 
     @sinatra.get "/add" do 
      return @calculator.add(1,1) 
     end 
    end 
end 

class Calculator 
    def add(a,b) 
     return a+b; 
    end 
end 

sinatra = Sinatra.new 
calculator = Calculator.new 

routing_class = SomeRouteClass.new(sinatra, calculator) 
routing_class.setup_routes 

sinatra.run! 

किसी भी वर्तनी/वाक्य रचना गलतियों यह सिर्फ एक त्वरित उदाहरण है माफ कर दो, लेकिन जैसा कि आप देख सकते हैं एक वर्ग मार्गों पंजीकृत करता है और जब उस मार्ग मारा जाता है कुछ कैलकुलेटर का एक उदाहरण के द्वारा उत्पन्न मान देता है इसे तुरंत शुरू किया गया था।

समस्या मेरे पास है कि इस उदाहरण में जब मैं कोशिश करता/चलाता हूं तो यह मुझे बताता है कि @ कैलकुलेटर एक नील क्लास है, और मेरा मानना ​​है कि सिनात्रा सिर्फ कोड के ब्लॉक को लेता है संदर्भ। यह किसी भी साधारण टेम्पलेट प्रतिपादन के लिए ठीक लगता है, लेकिन यदि आपको कुछ और फैंसी करने की ज़रूरत है, या स्टेटिक्स और सिंगलेट्स का उपयोग न करके अपने कोड मॉड्यूलर को रखना चाहते हैं तो आपको इसके आसपास कोई रास्ता नहीं लगता है ...

मेरी धारणाएं यहाँ सही हैं? और अगर ऐसा है तो संदर्भ रखने का कोई तरीका है क्योंकि ऐसा लगता है कि मुझे कोड को बनाए रखने के लिए बुरी और कड़ी मेहनत करने के लिए मजबूर करना पड़ रहा है अगर मुझे मार्ग से बातचीत करने के लिए सब कुछ स्टैटिक्स और सिंगलेट्स लिखना है।

== संपादित करें ==

सवाल और सामग्री का पुनर्गठन और अधिक सही वास्तविक समस्या को प्रतिबिंबित करने के, अब मैं पुस्तकालय का एक मजबूत समझ है है।

+1

, ऐसा लगता है कि यह सिर्फ कॉपी और पेस्ट करता deine_method का उपयोग कर एक नई विधि में मार्ग के साथ उपयोग की जाने वाली विधि। तो वहाँ है कि विधि के बाहर कोई संदर्भ ... जिसका मतलब है कि कि चारों ओर एक ही रास्ता सब कुछ स्थिर, बस गलत लगता है जो ... के रूप में अपनी कठिन बदल सकते हैं और इस तरह से परीक्षण करने के लिए बनाने के लिए किया जाएगा है ... मैं पूरी तरह से हो सकता है इसके बारे में गलत क्या है क्योंकि रूबी अभी भी मेरे लिए एक नई भाषा है। – Grofit

+0

स्थिरांक वस्तु पैटर्न का उपयोग करने के लिए इस के आसपास पाने के लिए कोशिश कर रहा है, लेकिन यह अभी भी बातें वास्तव में बुरा कर रहा है सब कुछ के रूप में इस काम करने के लिए स्थिर हो गया है ... वहाँ एक कारण है कि वे एक नई विधि में विधि शरीर नकल है तो यह सभी संदर्भ खो देता है? के रूप में मैं कोई लाभ यह करने के लिए नहीं देख सकते हैं, बस कमियां ... हालांकि फिर से मैं इस के लिए नया हूँ तो पूरी तरह से कुछ उलझन जो इस आवश्यकता को नहीं समझ सकते। केवल एक चीज जिसे मैं सोच सकता हूं वह यह है कि विधि निकाय वस्तु को साफ़ किया जा सकता है या विधि को अपडेट किया जा सकता है या इसे कहने से पहले उदाहरण से हटाया जा सकता है, हालांकि ऐसा लगता है कि – Grofit

उत्तर

0

मैं इस सवाल का जवाब स्वीकार नहीं कर सकते, लेकिन अधिक अनुसंधान करने के बाद हो सकता है कि रूबी स्थिर वर्गों की तरह एक गतिशील भाषा में इस तरह के देखने के एक बिंदु से रखरखाव दुःस्वप्न के रूप में नहीं कर रहे हैं।

ऐसा लगता है कि अधिकांश प्रमुख रूबी पुस्तकालय स्थैतिक उदाहरण (या कॉन्स्ट) के खिलाफ काम करते हैं जो सेटअप का उपयोग करते हैं ... फिर भी यह मेरे लिए थोड़ा अजीब लगता है, जैसा डेटाबेस प्रदाता के दृष्टिकोण में है। अपने डेटाबेस स्थैतिक वर्ग को कॉल करना और अपने डेटाबेस से कनेक्ट करना बहुत आसान है और फिर क्वेरीिंग शुरू करना बहुत आसान है, हालांकि यदि आपको एक ही समय में 2 अलग-अलग डेटाबेस से कनेक्ट करने की आवश्यकता है तो क्या होगा। आपको एक ही स्थैतिक वर्ग के साथ सर्वर को स्वैप करना होगा जो परेशानी होगी।

वैसे भी यह लगता है कि इस समय लगता है जैसे उत्तर किसी रूट पर बेनकाब करने के लिए आवश्यक है, तो जब आप परीक्षण कर रहे हों तो बस उस नकली को सेट करें। यह अभी भी थोड़ी पागल कह रही है, ये चीजें हैं, जब वास्तव में वे शब्द की वास्तविक अर्थ में नहीं हैं क्योंकि उन्हें किसी भी समय बदला जा सकता है ... नए रूबी डेवलपर्स के लिए कई चीजों की तरह यह सिर्फ भ्रमित लगता है यह (यानी एल्सिफ़, @@ ब्लाह, वैरिएबल केस परिभाषित करता है कि क्या इसका आधार है या नहीं)।

जैसा कि मैंने कहा था कि अगर मैं कोई और मुझे ऐसा करने का बेहतर पैटर्न दिखा सकता हूं तो मैं इस जवाब को स्वीकार नहीं करूंगा, लेकिन इस पल के लिए यह कुछ और दिन देगा।

+0

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

-2
class SomeRouteClass 
    def initialize(sinatra, calculator) 
     @calculator = calculator 
     @sinatra = sinatra 
    end 

    def calculator 
     @calculator 
    end 

    def setup_routes 
     @sinatra.get "/add" do 
      return calculator.add(1,1) 
     end 
    end 
end 
+1

एक अपवाद का कारण बनता है: अपरिभाषित स्थानीय चर या विधि 'कैलकुलेटर '# <# <वर्ग: 0x2b330e0>: 0x29c9a60> के लिए, मैं देख रहा हूँ तुम वहाँ क्या करने की कोशिश कर रहे हैं, लेकिन यह अभी भी अजीब लगता है। निश्चित रूप से के रूप में जब आप एक मार्ग आप पैटर्न-एक्स कॉल विधि-Y के लिए कह रहे हैं रजिस्टर, लेकिन सिनात्रा सिर्फ विधि और बिन उसके चारों ओर वर्ग बाहर बांधना करता है? तो अब उस विधि के बाहर के दायरे में कोई संदर्भ नहीं है? – Grofit

0

get के लिए पारित ब्लॉक Calculator वस्तु से एक अलग संदर्भ में मूल्यांकन किया जाता है। सिनात्रा शायद instance_eval या उसके चचेरे भाई में से एक को बुला रहा है। हालांकि, यह आसपास के दायरे से स्थानीय चर पर कब्जा करने के लिए, निम्न (अपरीक्षित, अफसोस) दृष्टिकोण की तरह कुछ का उपयोग कर संभव हो जाना चाहिए: स्रोत कुछ और के माध्यम से देखने के बाद

def setup_routes 
    calculator = @calculator 
    @sinatra.get "/add" do 
     return calculator.add(1,1) 
    end 
end