2014-04-14 9 views
8

में "क्लास प्रारंभ नहीं हुआ" त्रुटि देता है मैं आने वाली घटनाओं के लिए जानकारी बनाने और प्रदर्शित करने के लिए एक हल्का ऐप बना रहा हूं। मेरे पास एक इवेंट क्लास परिभाषित है जो पैरामीटर के रूप में एक हैश को तर्क देता है। प्रारंभिक विधि नीचे परिभाषित की गई है।रूबी: कक्षा.न्यू रेल कंसोल

class Event < ActiveRecord::Base 

    def initialize(args={}) 
    @what  = args[:what] 
    @theme  = args[:theme] 
    ... 
    end 
end 

अभी तक, बहुत अच्छा है। फिर, रेल कंसोल में, मैं एक हैश को परिभाषित करता हूं और ईवेंट का उदाहरण बनाने का प्रयास करता हूं लेकिन निम्न त्रुटि प्राप्त करता हूं।

[4] pry(main)> args = {what: 'what', theme: 'theme'} 
=> {:what=>"what", :theme=>"theme"} 
[5] pry(main)> Event.new(args) 
=> #<Event not initialized> 

यह वास्तव में सीधा लगता है लेकिन मुझे इसे समझने में परेशानी हो रही है। किसी भी मदद की सराहना की है।

+0

क्या यह प्रासंगिक है? http://stackoverflow.com/questions/11945070/how-do-i-initialize-an-model-object-in-ror – Amadan

+0

नहीं, मुझे कक्षा के लिए डिफ़ॉल्ट प्रारंभिक मानों की आवश्यकता नहीं है। नीचे दिया गया एआर जवाब वह था जिसे मैं ढूंढ रहा था। – darkmoves

उत्तर

12

यदि आप def initialize एक्टिव रिकार्ड-विरासत कक्षाओं के लिए ब्लॉक करना चाहते हैं, तो आपको उपखंड को उचित रूप से प्रारंभ करने के लिए इस ब्लॉक के अंदर super(args) पर कॉल करना होगा।

हालांकि, अगर what और theme आपके मॉडल में कॉलम के रूप में पहले से मौजूद है, तो आपको प्रारंभिक विधि की आवश्यकता नहीं है: Event.new(args) बॉक्स से ठीक काम करेगा।

एक अच्छा अभ्यास केवल initialize ब्लॉक का उपयोग करना होगा जब आपको अपने ActiveRecord स्कीमा में मौजूद चर को परिभाषित करने की आवश्यकता होती है (उदाहरण के लिए इंस्टेंस वेरिएबल्स सेट करना जो दृढ़ता की आवश्यकता नहीं है), लेकिन यदि आपको ऐसा करने की आवश्यकता है तो यह है attr_accessor का उपयोग करने के लिए अधिक सामान्य अभ्यास।

+1

यह समझ में आता है। मुझे पता था कि मैं कुछ आसान याद कर रहा था। उस ने कहा, अगर त्रुटि संदेश अधिक वर्णनात्मक था तो यह अच्छा होगा। – darkmoves

+2

इस उत्तर का आधा हिस्सा गलत है। आप वास्तव में एक एआर विरासत वर्ग पर 'def defizeize 'कर सकते हैं; हालांकि आपको बाल वर्ग को प्रारंभिक रूप से प्रारंभ करने के लिए प्रारंभिक ब्लॉक में 'सुपर (तर्क)' को कॉल करने की आवश्यकता होगी। स्टीव कॉलम के बारे में सही है, अगर वे पहले से ही 'प्रारंभिक' ब्लॉक से परेशान करने की आवश्यकता नहीं है। –

+1

@ जोर्डन बेकर अच्छा बिंदु, संपादन के लिए धन्यवाद। मैंने एक विकल्प के रूप में 'attr_accessor' का उपयोग करने के बारे में स्पष्टीकरण को मंजूरी दे दी है। – SteveTurczyn

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