2012-04-12 16 views
11

मेरे आवेदन के दौरान self. उपयोगकर्ता के नाम का संदर्भ देने के लिए आवश्यक नहीं है। name ठीक काम करता है।ActiveRecord/Rails मॉडल गुणों तक पहुंचने के लिए "स्वयं" का उपयोग क्यों करें?

निम्नलिखित कोड को self को इरादे के अनुसार काम करने की आवश्यकता क्यों है?

class User< ActiveRecord::Base 
    before_save :validate_name 

def validate_name 
    if self.name.nil? || self.name.empty? 
     self.name= "Mr. No Name" 
    end 
end 

वैसे, मुझे पता है कि validates_presence_of बचाने को रोकने के लिए इस्तेमाल किया जा सकता है, लेकिन मैं एक डिफ़ॉल्ट के साथ को बचाने के लिए अगर कोई नाम दिया जाता है चाहता हूँ।

रेल 3.0.7।

उत्तर

23

अक्सर self का उपयोग रूबी को यह समझने के लिए मजबूर करना है कि एक विधि कॉल के रूप में और इसे एक चर के रूप में गलत व्याख्या नहीं करना है। day= नामक विधि के पूर्व ज्ञान के बिना, day = "x" रूबी को एक चर असाइनमेंट की तरह दिखता है। self.day = "x" हमेशा एक विधि कॉल है।

कारण यह समस्या है क्योंकि उपयोगकर्ता श्रेणी फ़ाइल को पार्स किए जाने के बाद name और name= विधियों को गतिशील रूप से जोड़ा जाता है। मॉडल का उपयोग करते समय रेल पहली चीजें संबंधित डेटाबेस फ़ील्ड के लिए विधियां बनाती हैं, लेकिन यह आपके user.rb फ़ाइल को पार्स करने के बाद होता है।

+0

क्षमा करें, 'self.day'' self.name' होना चाहिए था! मैंने सवाल अपडेट किया। –

+6

नाइट: रुबी कभी भी एक विधि कॉल होने के लिए 'x = y' नहीं ले पाएगा। यह हमेशा एक प्रत्यक्ष चर (या स्थिर, मामले के आधार पर) असाइनमेंट है। फॉर्म 'x' (अभिव्यक्ति के रूप में) इस बात पर निर्भर करता है कि इस तरह का' x' गुंजाइश है (एक चर के रूप में) या नहीं। –

+0

यदि वर्ग फ़ाइल पार्स किए जाने के बाद 'name' और' name = 'गतिशील रूप से जोड़े जाते हैं, तो ऐसे समय होते हैं जब 'name' का अर्थ' self.name' होता है और अन्य बार जब 'name' स्थानीय चर होता है? –

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

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