Rails के साथ काम करने को इतना अच्छा बनाने वाली चीजों में से एक यह है कि किसी भी सामान्य प्रोग्रामिंग आवश्यकता के लिए---प्राधिकरण, साइट प्रशासन, ईकॉमर्स, आप इसे नाम दें---आपसे ज्यादा चालाक किसी ने शायद आपकी समस्या का समाधान कोड किया है और इसे एक जेम के रूप में पैकेज किया है।
आप निश्चित रूप से अपने जेमफाइल में जेम्स जोड़ सकते हैं और वास्तव में यह समझे बिना उनकी उपयोगिता का पूरा लाभ उठा सकते हैं कि वे कैसे काम करते हैं, लेकिन क्या आप कभी उत्सुक हुए हैं कि यह सब कैसे वायर्ड अप हो जाता है?
यहाँ हम रयान बेट्स के CanCan प्राधिकरण जेम पर करीब से नज़र डालेंगे और निम्नलिखित प्रश्नों का उत्तर देंगे (जो, यदि अधिक व्यापक रूप से पूछे जाएं, तो किसी भी जेम पर लागू हो सकते हैं):
CanCan का कोड कहाँ संग्रहीत होता है?
`can?` मेथड कहाँ परिभाषित है?
Rails CanCan के कोड को कब/कहाँ/कैसे लोड करता है?
सबसे पहले, मेरे जेमफाइल में CanCan है और मैं `bundle install` करता हूँ:
# Gemfile gem "cancan", "~> 1.6.10"``` $ bundle install
Bundler के साथ वास्तव में यह देखना आसान है कि कोई विशेष जेम कहाँ रहता है। बस `bundle show` का उपयोग करें:
$ bundle show cancan /Users/jasonswett/.rvm/gems/ruby-2.0.0-p0/gems/cancan-1.6.10
यह प्रश्न #1 का ख्याल रखता है। अब `can?` कहाँ परिभाषित है?
$ cd /Users/jasonswett/.rvm/gems/ruby-2.0.0-p0/gems/cancan-1.6.10 $ grep -r 'def can?' * lib/cancan/ability.rb: def can?(action, subject, *extra_args) lib/cancan/controller_additions.rb: def can?(*args)
ऐसा लगता है कि वास्तव में दो अलग-अलग `can?` फ़ंक्शन हैं। जिसमें हम रुचि रखते हैं वह `lib/cancan/ability.rb` में है।
# lib/cancan/ability.rb def can?(action, subject, *extra_args) match = relevant_rules_for_match(action, subject).detect do |rule| rule.matches_conditions?(action, subject, extra_args) end match ? match.base_behavior : false end
जहां तक वास्तव में यहां क्या हो रहा है, आपका अनुमान उतना ही अच्छा है जितना मेरा, लेकिन यह महत्वपूर्ण हिस्सा नहीं है। टेकअवे यह है कि यदि आप किसी जेम के साथ किसी समस्या से टकरा रहे हैं, तो अब आप यह पता लगाने के लिए जेम के कोड में खुदाई करने के लिए सुसज्जित हैं कि क्या हो रहा है।
अब जब हम जानते हैं कि जेम का कोड कहां रखा जाता है और इसमें कैसे जाना है, तो Rails को जेम के बारे में कैसे पता चलता है, और यह जेम का कोड कब लोड करता है?
यह Rails इनिशियलाइज़ेशन दस्तावेज़ीकरण के एक निश्चित अनुभाग में शामिल है। यहाँ प्रासंगिक भाग है:
एक मानक Rails एप्लिकेशन में, एक जेमफाइल होता है जो एप्लिकेशन की सभी निर्भरताओं की घोषणा करता है। config/boot.rb ENV['BUNDLE_GEMFILE'] को इस फ़ाइल के स्थान पर सेट करता है। यदि जेमफाइल मौजूद है, तो bundler/setup की आवश्यकता होती है।
यह इनिशियलाइज़ेशन प्रक्रिया में जल्दी होता है: सटीक होने के लिए दूसरा चरण। यह समझ में आता है चूंकि यदि आपका प्रोजेक्ट एक निश्चित जेम पर निर्भर करता है, तो कौन जानता है कि आप इसे कहां संदर्भित कर सकते हैं। इसे जल्द से जल्द लोड करना बेहतर है ताकि इसका कोड कहीं भी उपयोग किया जा सके।