5

मैं रेलवे पर बस कुछ रेलों का अभ्यास कर रहा हूं और कुछ ऐसा समझ गया हूं जिसे मैं समझने की कोशिश कर रहा हूं।रेल पर रूबी में स्वयं क्या करता है?

मुझे यह नहीं मिला कि प्रमाणीकरण विधि पर "स्वयं" क्या कर रहा था। इसलिए मैं इसे नष्ट कर दिया और अगर यह एक त्रुटि प्रदर्शित होगा देखने के लिए अपने ऐप के लॉगिन परीक्षण किया है और यह किया:

error: 

**NoMethodError in SessionsController#create 
undefined method `authenticate' for #<Class:0x00000102cb9000**> 

मैं वास्तव में अगर किसी को समझा सकता है कि वास्तव में क्या है कि "स्व" क्या कर रहा है की सराहना करेंगे। मैं यह पता लगाने की कोशिश कर रहा था कि क्या हो रहा था लेकिन मेरे सिर को इसके चारों ओर नहीं मिल सका।

विधि मॉडल में परिभाषित किया गया है और सत्र_कंट्रोलर में कहा जाता है .. मैं लगातार अपने ऐप को हटा रहा हूं और इसे लटकने के लिए स्क्रैच से शुरू कर रहा हूं और हर बार जब मैं फिर से शुरू करता हूं तो मुझे कई चीजें समझ में आती हैं लेकिन मैं हूं "स्वयं" पर फंस गया।

मैं सिर्फ उस व्यक्ति का प्रकार हूं जो समझना पसंद करता है कि कुछ क्यों काम करता है।

नियंत्रक:

def create 
    user = User.authenticate(params[:email], params[:password]) 
    if user 
     session[:user_id] = user.id 
     redirect_to root_path, :notice => "Logged In" 
    else 
     flash.now.alert = "Invalid credentials" 
     render "new" 
    end 
    end 

मॉडल:

def self.authenticate(email, password) 
     user = find_by_email(email) 
    if user && user.password_hash == BCrypt::Engine.hash_secret(password, user.password_salt) 
     user 
    else 
     nil 
    end 
    end 

उत्तर

13

यह एक मूल रूबी सवाल है। इस मामले में, self का उपयोग कक्षा विधि को परिभाषित करने के लिए किया जाता है।

class MyClass 
     def instance_method 
     puts "instance method" 
     end 

     def self.class_method 
     puts "class method" 
     end 
    end 

कौन इस तरह इस्तेमाल कर रहे हैं:

instance = MyClass.new 
    instance.instance_method 

या:

MyClass.class_method 

आशा है कि चीजें एक छोटा सा ऊपर साफ करता है।इसके अलावा देखें: पूरा होने की खातिर http://railstips.org/blog/archives/2009/05/11/class-and-instance-methods-in-ruby/

+1

आपके उत्तर में थोड़ा विस्तार: 'def object.my_foo_method'। 'Obj' पर' my_foo_method' परिभाषित करता है। आपके उत्तर के संदर्भ में, 'स्वयं' वर्ग 'वर्ग' (अर्थात वर्ग 'MyClass') का उद्देश्य है। इसलिए, यह उस वर्ग की विधि को परिभाषित करता है। – Swanand

+0

उदाहरणों के लिए '@' चिह्न का उपयोग नहीं किया जाना चाहिए, उदा। @instance = ...? –

+0

ने कहा कि यह रेल है और शायद इसे देखने में इस्तेमाल किया जाएगा –

2
class User 
    def self.xxx 
    end 
end 

वर्ग विधि को परिभाषित करते हुए

class User  
    def xxx 
    end 
end 

एक उदाहरण विधि परिभाषित करेगा का एक तरीका है।

यदि आप स्वयं को हटा देते हैं। डीईएफ़ से, आप एक विधि नहीं मिला त्रुटि मिलती है जब आप

User.authenticate 

करते हैं, क्योंकि आप एक वर्ग के बजाय वर्ग का एक उदाहरण पर एक विधि कॉल करने की कोशिश कर रहे होंगे। एक उदाहरण विधि का उपयोग करने के लिए, आपको कक्षा के उदाहरण की आवश्यकता है।

4

selfवर्ग बजाय वर्ग के उदाहरण की एक विधि को परिभाषित करता है। तो def self.authenticate साथ आप निम्न कर सकते हैं:

u = User.authenticate('[email protected]','[email protected]') 
कर के बजाय

...

u = User.new 
u.authenticate('[email protected]','[email protected]') 

इस तरह, आप उपयोगकर्ता का एक उदाहरण एक प्रमाणित करने के लिए बनाने के लिए नहीं है।

+0

किसी विधि का उपयोग करने के लिए कक्षा को तुरंत चालू करने की आवश्यकता से बचने के अलावा, उदाहरण विधियों के बजाय कक्षा विधियों को परिभाषित करने के अन्य कारण हैं? – LazerSharks

3

और भविष्य सिर दर्द को विफल करने के, मैं यह भी कहना है कि दो बराबर हैं चाहते हैं:

class User 
    def self.authenticate 
    end 
end 

class User 
    def User.authenticate 
    end 
end 

प्राथमिकता का मामला।

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