2010-12-16 22 views
10

ओवरराइटिंग बनाम फिर से खोलना मैं परीक्षण में उपयोग करने के लिए रेल मॉडल में एक विधि जोड़ना चाहता हूं। अगर मैं रेल कंसोल में या चलाने के समय लोड एक फ़ाइल में इसरुबी/रेल: एक कक्षा

class Model 
    def something_new 
    do_something 
    end 
end 

करते हैं, मॉडल के बजाय ओवरराइट है संशोधित। यदि मैंने उपर्युक्त पंक्तियों से पहले v = Model.class जैसे कुछ डाला है, तो नई विधि सफलतापूर्वक मौजूदा कक्षा में जोड़ दी गई है। जाहिर है कि संकेत देने के लिए संदर्भ की आवश्यकता है कि एक मौजूदा वर्ग फिर से खोला जा रहा है।

दूसरी ओर, कोई भी इसे पहले संदर्भित किए बिना फिक्सनम कहने के लिए एक विधि जोड़ सकता है। यहां क्या हो रहा है, और यह सुनिश्चित करने का सामान्य तरीका क्या है कि मौजूदा वर्ग को फिर से खोला और संशोधित करने के बजाय संशोधित किया गया है?

धन्यवाद।

उत्तर

11

ऐसा लगता है कि आपको इसका उपयोग करने से पहले कक्षा की आवश्यकता नहीं है। जब आप Model.class लिखते हैं और कोई मॉडल क्लास नहीं है, तो रेल स्वचालित रूप से आपके लिए मॉडल लाती है। यदि आप बस class Model लिखते हैं, तो यह केवल क्लास परिभाषा के रूप में देखता है। बस require 'model' काम करना चाहिए।

+0

धन्यवाद, यह समस्या थी। जब मैंने देखा कि मॉडल वर्ग पहले ही पहचाना गया था, मुझे एहसास नहीं हुआ कि यह केवल "स्वचालित रूप से" पहचाना गया था। –

4

class_eval का उपयोग करें, इस तरह आप कक्षा को सही तरीके से फिर से खोलेंगे।
यहां reopening classes पर एक बहुत अच्छा लेख है।

+0

धन्यवाद। यह एक अच्छा लेख है। –

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