2013-03-20 7 views
10

मैं Rails tutorial by Michael Hartl कर रहा हूँ, और मैं बात करने के लिए आए हैं, जहां आप बस जोड़ें।has_secure_password मेरे मॉडल वर्ग में कैसे काम करता है? अपने मॉडल वर्ग के लिए</p> <pre><code>has_secure_password </code></pre> <p>और जादू का एक समूह होता है:

मैं समझता हूं कि यह विधि ActiveModel::SecurePassword मॉड्यूल से आता है जो ActiveRecord::Base में शामिल है, जो मेरी मॉडल कक्षा विस्तारित होती है।

जो मुझे समझ में नहीं आता है, जब मैं अपनी कक्षा परिभाषा में एक पंक्ति जोड़ता हूं तो क्या हो रहा है। क्या कोई भी संभवतः जितना संभव हो उतना विस्तार से समझा सकता है। मैं वास्तव में समझना चाहता हूं कि क्या हो रहा है और न केवल मेरे ऐप पर सामान फेंक रहा है यह जानकर कि यह कैसे काम करता है।

(इसे समझने की क्यों मुझे संदेह में हूँ में मदद करता है, तो मैं एक जावा पृष्ठभूमि से आते हैं और मैं रूबी के लिए नया हूँ)

+0

मुझे लगता है कि शायद टिप्पणी करने की इस पंक्ति के पर्याप्त लोग हैं, दोस्तों। –

उत्तर

8

समझ के लिए सबसे आसान तरीका क्या कुछ भी की कर स्रोत से परामर्श करने के लिए है! इस मामले में, यह ActiveModel::SecurePassword documentation होगा। कि से, आप देख सकते हैं has_secure_password करता है कि:

def has_secure_password 
    # Load bcrypt-ruby only when has_secure_password is used. 
    # This is to avoid ActiveModel (and by extension the entire framework) being dependent on a binary library. 
    gem 'bcrypt-ruby', '~> 3.0.0' 
    require 'bcrypt' 

    attr_reader :password 

    validates_confirmation_of :password 
    validates_presence_of  :password_digest 

    include InstanceMethodsOnActivation 

    if respond_to?(:attributes_protected_by_default) 
    def self.attributes_protected_by_default 
     super + ['password_digest'] 
    end 
    end 
end 

अंग्रेजी में व्याख्या करने के लिए, इस समारोह:

  1. लोड bcrypt-ruby रत्न और bcrypt की आवश्यकता है। bcrypt एक सुरक्षित हैशिंग फ़ंक्शन है जिसे आप विकिपीडिया में और जान सकते हैं।
  2. password नामक मॉडल में केवल पढ़ने योग्य विशेषता जोड़ता है।
  3. मान्य करता है कि पासवर्ड किसी अन्य फ़ील्ड द्वारा पुष्टि की जाती है, जिसे password_confirmation कहा जाता है। दूसरे शब्दों में, आपको इसकी पुष्टि करने के लिए दो बार पासवर्ड दर्ज करना होगा।
  4. यह सुनिश्चित करता है कि मॉडल सहेजे जाने से पहले password_digest मौजूद है।
  5. instance methods लोड करें, जो इस मामले में authenticate (जो सही है यदि पासवर्ड सही है, अन्यथा गलत है) और password=, जो पासवर्ड_डिजिस्ट विशेषता में पास पासवर्ड को एन्क्रिप्ट करता है।
  6. यदि विधि में विशेषताएँ हैं जो डिफ़ॉल्ट रूप से संरक्षित हैं, तो यह संरक्षित विशेषताओं की सूची में password_digest भी जोड़ देगा। (इस प्रकार इसे बड़े पैमाने पर सौंपा जा रहा है।)

आप ActiveModel::SecurePassword documentation और further documentation on its instance attributes पर और जान सकते हैं।

+0

मैंने पोस्ट करने से पहले स्रोत पर एक नज़र डाली। जो मुझे भ्रमित कर रहा है वह 'आवश्यकता' है और विधि के बीच में बैठे 'शामिल' है। मैं जावा से आया हूं, इसलिए जब मुझे 'आवश्यकता' दिखाई देता है तो मेरा दिमाग 'आयात' कहता है जो केवल जावा में कक्षा परिभाषा के ऊपर वाक्य रचनात्मक रूप से मान्य है। विधि के बीच में बैठे 'attr_reader' भी थोड़ा उलझन में है। मैं रुबी कोन्स के माध्यम से गया, और इस तरह से कुछ भी नहीं आ रहा याद है, लेकिन फिर मैंने इसे बहुत तेजी से उड़ा दिया। मुझे रूबी के साथ कुछ मौलिक याद आ रही है। क्या मुझे आपसे सही दिशा निर्देशन मिलेगा? –

+0

जावा के विपरीत, रुबी में आप कक्षाओं में कहीं भी 'कक्षाओं' की आवश्यकता हो सकती है ताकि नए वर्गों और अन्य स्रोतों से तरीकों को खींच सकें। 'attr_reader' एक एक्सेसर है: आप उनके बारे में अधिक पढ़ सकते हैं [यहां] (http://www.rubyist.net/~slagell/ruby/accessors.html) (या केवल रुबी एक्सेसर्स के लिए Google)। – Veraticus

+0

हां, लेकिन एक्सेसर को एक विधि के मध्य में घोषित किया गया है, जिसमें मेरी कक्षा में एक मॉड्यूल शामिल है। एक्सेसर्स (आपके लिंक सहित) पर मैंने जो भी उदाहरण देखा है, वह क्लास परिभाषा के हिस्से के रूप में अपना उपयोग दिखाता है। मुझे यकीन नहीं है कि यह कक्षा में वापस कैसे संबंधित है, मैं इस विधि को कॉल कर रहा हूं। –

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