2009-08-28 40 views
51

में घोषित मैं सिर्फ पटरियों पर रूबी सीखने शुरू कर दिया है और मैं नीचे की तरह कोड का सामना करना पड़ा:रूबी विधि कॉल वर्ग शरीर

class Post < ActiveRecord::Base 
validates_presence_of :title 
belongs_to :user 
end 

दो विधि वर्ग शरीर के अंदर कॉल कर रहे हैं। मुझे किसी भी रूबी दस्तावेज को खोजने में कठिनाई हुई है जो बताता है कि कक्षा के किसी शरीर (लेकिन किसी भी विधि के बाहर) के भीतर से विधि कैसे कॉल करती है। मेरे पास सभी पुस्तकों का वर्णन है कि कक्षा और उदाहरण विधियों को परिभाषित करने के तरीके और कैसे उन्हें अन्य तरीकों से कॉल करें।

मेरे पास प्रश्न हैं: इन तरीकों को कैसे और कब कहा जाता है? वे कैसे परिभाषित किए जाते हैं? क्या वे कुछ सक्रिय रिकॉर्ड मॉड्यूल में परिभाषित मिश्रित हैं?

उत्तर

3

जो आप देख रहे हैं वह ActiveRecord ऑब्जेक्ट के लिए क्लास लेवल विधियां हैं। अपने स्वयं के तरीकों को लिखने के लिए जो ऐसा करते हैं, आप उन्हें एक प्लगइन के रूप में लिखेंगे और फिर कक्षा परिभाषा को दोबारा खोलकर उन्हें ActiveRecord में शामिल करेंगे। रूबी ऑन रेल्स एक प्लगइन बनाने के लिए गाइड:

http://guides.rubyonrails.org/plugins.html

कवर कैसे एक इस तरह के एक प्लगइन/वर्ग स्तर की विधियों को लिखेंगे। यह किस तरह के तरीकों का अर्थ है और वे उदाहरणों के साथ कैसे बातचीत करते हैं, इस बारे में अपने सिर को लपेटने के तरीके पर एक अच्छा दस्तावेज़ है।

+1

एक मणि भी काम करता है। –

11

पुन: इन तरीकों को कैसे और कब कहा जाता है?

[कक्षा को लोड होने पर उन्हें बुलाया जाता है। आप तरीकों में से एक में ब्रेकपॉइंट डाल सकते हैं और देख सकते हैं कि इसे आपके रेल प्रोजेक्ट के स्टार्टअप का हिस्सा कहा जाता है।]

उन्हें कैसे परिभाषित किया जाता है?

[वे कक्षा के तरीके हैं। चूंकि यह रूबी है, इसलिए उन्हें कई तरीकों से परिभाषित किया जा सकता है।]

क्या वे कुछ सक्रिय रिकॉर्ड मॉड्यूल में परिभाषित मिश्रित हैं?

[इस मामले में,

validates_presence_of विक्रेता/रेल में परिभाषित किया गया है/ActiveRecord/lib/active_record/validations.rb

belongs_to विक्रेता/रेल में परिभाषित किया गया है/ActiveRecord/lib/active_record/

associations.rb

ActiveRecord, एक बड़ा प्रणाली है देखने के लिए जहां तरीकों परिभाषित कर रहे हैं कई mixins, मॉड्यूल, आदि

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

]

29

एक वर्ग परिभाषा के शरीर किसी भी अन्य की तरह कोड के लिए एक निष्पादन संदर्भ है। कोड के संदर्भ में कोड निष्पादित किया जाता है (जिसका अर्थ है self कक्षा वस्तु है, जो कक्षा का एक उदाहरण है)। आपके पास स्थानीय और आवृत्ति चर हो सकते हैं (जो कक्षा के उदाहरणों के बजाए क्लास ऑब्जेक्ट से संबंधित होंगे) और आप क्लास ऑब्जेक्ट का जवाब देने वाली किसी भी विधि को कॉल कर सकते हैं। वर्ग परिभाषा ब्लॉक समाप्त होने के बाद कोड चलाया जाता है।

इस मामले में, ActiveRecord :: बेस वर्ग विधियों को validates_presence_of और belongs_to परिभाषित करता है।

16

येहुदा काट्ज़ ने अपने ब्लॉग पर इसका एक अच्छा स्पष्टीकरण दिया है। बिंदु 4: Class Bodies Aren't Special देखें।

11

ये कक्षा विधियां या 'सिंगलटन' विधियां हैं। एक को attr_accessor से परिचित होना चाहिए। हम टेस्ट क्लास में ऐसा कुछ कार्यान्वित कर सकते हैं।

class Klass 
    def self.add_getter_and_setter(symbol) 
    module_eval "def #{symbol}; @#{symbol}; end" 
    module_eval "def #{symbol}=(val); @#{symbol} = val; end" 
    end 
end 

class Person < Klass 
    add_getter_and_setter :name 
    add_getter_and_setter :phone 
end 

person = Person.new 
person.name = 'John Smith' 
person.phone = '555-2344' 
person # returns <Person:0x28744 @name="John Smith", @phone="555-2344"> 

ऊपर के उदाहरण में हम 'डीईएफ़ self.add_getter_and_setter' के साथ वर्ग विधि बनाया है, लेकिन यह एक ही रास्ता नहीं है।

class Klass 
    class << self # opens the singleton class 
    def add_getter_and_setter(symbol) # note we dont specify self as it is already within the context of the singleton class 
     .. 
    end 
    end 
end 

विस्तार का उपयोग करना। मॉड्यूल # विस्तार एक विधि है जो क्लास विधियों के साथ कक्षा को विस्तारित करती है इसी तरह विधि मॉड्यूल # में उदाहरण विधियों के साथ एक वर्ग शामिल है।

class Klass 
    extend(Module.new do 
    def add_getter_and_setter(symbol) 
     .. 
    end 
    end) 
end 

Klass पहले से ही परिभाषित किया गया है, तो हम इसे फिर से खोलना कर सकते हैं वर्ग पद्धतियां जोड़ने का

class Klass 
end 

def Klass.add_getter_and_setter(symbol) 
    .. 
end 

# or 

class << Klass 
    def add_getter_and_setter(symbol) 
    .. 
    end 
end 

खैर उन कुछ तरीके मैं कैसे इस बहुत अलग वाक्य रचना करने के लिए यदि आप देखते हैं सिर्फ अपने सभी एहसास जानते हैं वही काम करना

नोट: रेल में एक सामान्य श्रेणी विधि हम सभी का उपयोग 'ढूंढ' है। यह मॉडल वर्ग से सीधे चलाया जाता है।

person = Person.find(1) # finds a person with id:1 
संबंधित मुद्दे