में self.method_name बनाम classname.method_name के उपयोग को समझने का प्रयास कर रहा है। मैं classname.method_name का उपयोग करने के लिए self.method_name बनाम कब उपयोग करना है, यह समझने की कोशिश कर रहा हूं।रूबी
नीचे दिए गए उदाहरण में, "self_create" को "self.hash_password" या बस "हैश_पासवर्ड" के बजाय "User.hash_password" को संदर्भित करने की आवश्यकता क्यों है?
चूंकि हम पहले से ही उपयोगकर्ता वर्ग में हैं, मैंने सोचा था कि पहले_क्रिएट विधि "जानती है" कि "हैश_पासवर्ड" अपनी कक्षा का सदस्य है और इसे संदर्भित करने के लिए किसी विशेष वाक्यविन्यास की आवश्यकता नहीं होगी।
require 'digest/sha1'
class User < ActiveRecord::Base
attr_accessor :password
attr_accessible :name, :password
validates_presence_of :name, :password
validates_uniqueness_of :name
def before_create
self.hashed_password = User.hash_password(self.password)
end
def after_create
@password = nil
end
def self.login(name, password)
hashed_password = hash_password(password || "")
self.find(:first, :conditions => ["name = ? and hashed_password = ?", name, hashed_password])
end
def try_to_login
User.login(self.name, self.password)
end
private
def self.hash_password(password)
Digest::SHA1.hexdigest(password)
end
end
कहा जाता है क्योंकि अंतिम कुछ पंक्तियां def self.hash_password (पासवर्ड) को परिभाषित करती हैं, मैंने सोचा कि self.hash_password इस विधि को संदर्भित करता है। लेकिन आप स्वयं कह रहे हैं ..hash_password को NoMethodError मिलेगा - भले ही विधि परिभाषा "स्वयं" कहती है। मैं इसे "स्वयं" के साथ संदर्भित नहीं कर सकता। भ्रामक! –
self.hashed_password = एक विशेषता लेखक को कॉल करता है? लेकिन मैंने एक विशेषता लेखक को परिभाषित नहीं किया। क्या स्वचालित रूप से बनाया गया था? –
self.hashed_password = शायद आपके लिए ActiveRecord द्वारा परिभाषित किया गया है, यदि आपके पास 'हैशड_पासवर्ड' नामक डेटाबेस कॉलम है। – molf