2011-10-17 18 views
35

में कक्षा उपनाम मैं इसी तरह के मौजूदा एक के आधार पर एक नया रेल ऐप विकसित कर रहा हूं। मेरे पुराने ऐप में, मेरे पास कूपन क्लास है, जो मेरे नए ऐप में टिकट के समान ही है। मैं कूपन में सभी कोड का पुन: उपयोग करना चाहता हूं, लेकिन एक नए वर्ग के नाम के साथ।रुबी

चूंकि रिफैक्टरिंग रेल में बोझिल है, मुझे आश्चर्य है कि रूबी में एक वर्ग के लिए उपनाम बनाने का कोई तरीका है (गुणों और विधियों के लिए उपनाम के समान)। लेकिन मैं अपने कूपन वर्ग से टिकट उपवर्ग हैं - -

+14

क्या विरासत के बारे में? इस तरह कुछ: कक्षा कूपन <टिकट; अंत – WarHog

उत्तर

79

क्लासेस डॉन ' रूबी में नाम नहीं हैं। वे केवल किसी अन्य वस्तु की तरह वैरिएबल को आवंटित वस्तुएं हैं। ,

class Coupon 
    #... 
end 

# add this line of code to make alias for class names 
# option1. if you haven't defined a "Ticket" class: 
Ticket = Coupon 

# option2. if Ticket has been defined, you have to redefine it: 
Object.send :remove_const, "Ticket" 
const_set "Ticket", Coupon 

"किसी भी संदर्भ है कि एक अपरकेस अक्षर से शुरू होता: आप एक अलग चर के माध्यम से एक वर्ग का उल्लेख करना चाहते हैं, एक अलग चर के लिए असाइन करें:

Foo = String 
+0

जोर्ग, उस मणि के लिए धन्यवाद: यह बिल्कुल स्पष्ट है, फिर भी मैंने इससे पहले कभी नहीं सोचा था! – p4010

+0

धन्यवाद, जोर्ग। यह पूरी तरह से तार्किक, अभी तक आश्चर्यजनक समाधान है। :) – AdamNYC

+3

यह परिवर्तनीय नहीं है। यह स्थिर है (पूंजी पत्र के साथ शुरू होने वाले सभी पहचानकर्ता स्थिरांक हैं)। – Hauleth

2

मैं साथ warhog, कम या ज्यादा का मानना ​​है कि जिस तरह से अगर आप किसी भी डेटा munging क्या करने की जरूरत है, तो आप कोड अपने टिकट कक्षा में डाल सकते हैं

+0

सबक्लासिंग का अर्थ है आईएस-ए रिश्ते। मुझे लगता है कि जब तक यह समस्या डोमेन में सत्य नहीं है, हमें इसे सॉफ्टवेयर में नहीं करना चाहिए। –

11

फ़ाइल coupon.rb में कक्षाओं और मॉड्यूल के नाम सहित, एक निरंतर है "- < < मेटाप्रोग्रामिंग रूबी >>, पृष्ठ 38, कॉन्सटेंट सेक्शन

2

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

पढ़ने के बिना कार्पल सुरंग से बचने के लिए, आप वास्तविक वर्ग की बजाय अपने उपनाम वस्तु में लैम्ब्डा स्टोर कर सकते हैं। बेशक, लैम्ब्डा में कक्षा होती है लेकिन यह आश्वासन देता है कि आपके उपनाम आपकी कक्षा के नवीनतम संस्करण को कॉल करेंगे।

मैंने इसे अपने supermanpatches.rb रेल प्रारंभकर्ता (config/initializers/ के अंदर) और डैगर में रखा;

LAP = lambda { LosAngelesParcel } 

अब आप इस का उपयोग कर LAP[] और अपने वर्ग के एक ताजा ढाला संस्करण लोड किया जाएगा कॉल कर सकते हैं। (उदाहरण के लिए, उदाहरण बनाने के लिए, l = LAP[].new)

और डैगर; रेलवे लोड होने पर एक बार चलाता है & तब आपके ऐप के माध्यम से व्यापक है, किसी भी वैरिएबल वैरिएबल की तरह कॉल करने योग्य है, लेकिन 'रीड-ओनली' है, इसलिए बोलने के लिए।

+0

यह सही नहीं है 'कक्षा ए अंत; बी = ए; A.class_eval do def foo puts ("test") करता है; अंत अंत; बीएफयू ' यह परीक्षण मुद्रित करेगा क्योंकि ए और बी दोनों मेमोरी में एक ही ऑब्जेक्ट का संदर्भ लेंगे। भी bobject_id A.object_id के बराबर है तो आपको लैम्ब्डा –

+0

का उपयोग करने की आवश्यकता नहीं है यदि आप अपने कक्षाओं के तरीकों को अपडेट करते हैं तो आप –

+0

पर पहले से ही इसे एक्लास_एवल का उपयोग करके अपडेट कर चुके हैं, क्या इसे अपडेट करने का कोई और तरीका है? –

5

किसी को भी कैसे एक रेल मॉडल वर्ग उपनाम, नया नाम है करने के लिए की तलाश के लिए यहाँ आने:

मैं कर रहा था बस Foo = Bar करना है, लेकिन अंदर उसके अपने मॉडल फ़ाइल Foo डाल करने के लिए किया था, ताकि मैं नहीं होगा एक प्रारंभिक निरंतर त्रुटि प्राप्त करें। जैसे

# models/foo.rb 
Foo = Bar 

इसके अलावा, आप has_many, has_one आदि जैसे संगठनों में अन्य नाम का उपयोग करने की कोशिश कर weirdness मिल सकता हैमैंने पाया आप आमतौर पर जड़ नाम स्थान का उपयोग कर (या उचित नामस्थान कैसे अपने मॉडल संरचित कर रहे हैं पर निर्भर करता है) यकीन है कि रेल बनाने के लिए autoload कोशिश कर रहा है सही निरंतर द्वारा उन आसपास पहुंच सकते हैं:

has_many :foo, class_name: '::Foo'