रेल के साथ काम करना इतना अच्छा बनाने वाली चीजों में से एक यह है कि किसी भी सामान्य प्रोग्रामिंग आवश्यकता के लिए --- प्राधिकरण, साइट प्रशासन, ईकॉमर्स, आप इसे नाम दें --- किसी ऐसे व्यक्ति ने आपकी समस्या के समाधान को कोड किया है और इसे पैक किया है एक मणि के रूप में ऊपर।
आप निश्चित रूप से अपने Gemfile में रत्न जोड़ सकते हैं और उनकी उपयोगिता का पूरा लाभ उठा सकते हैं बिना यह समझे कि वे कैसे काम करते हैं, लेकिन क्या आप कभी उत्सुक हैं कि यह सब कैसे तार-तार हो जाता है?
यहां हम रयान बेट्स के कैनकैन प्राधिकरण रत्न पर करीब से नज़र डालेंगे और निम्नलिखित प्रश्नों के उत्तर देंगे (जो, यदि अधिक व्यापक रूप से पूछे जाएं, तो किसी भी रत्न पर लागू हो सकते हैं):
-
कैनकैन के लिए कोड कहाँ संग्रहीत किया जाता है?
-
can?
विधि परिभाषित? -
रेल कैनकैन के लिए कोड कब/कहां/कैसे लोड करता है?
सबसे पहले, मेरे जेमफाइल में कैनकैन है और मैं एक bundle install
करता हूं :
# Gemfile
gem "cancan", "~> 1.6.10"```
$ bundle install
बंडलर के साथ यह देखना वास्तव में आसान है कि कोई विशेष रत्न कहाँ रहता है। बस 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
जहाँ तक वास्तव में यहाँ क्या हो रहा है, आपका अनुमान मेरे जितना ही अच्छा है, लेकिन यह महत्वपूर्ण हिस्सा नहीं है। यहाँ महत्वपूर्ण बात यह है कि यदि आप किसी रत्न के साथ किसी समस्या का सामना कर रहे हैं, तो अब आप यह जानने के लिए रत्न के कोड में खुदाई करने के लिए तैयार हैं कि क्या हो रहा है।
अब जबकि हम जानते हैं कि रत्न का कोड कहाँ रखा जाता है और उसमें कैसे प्रवेश किया जाता है, रेल को रत्न के बारे में कैसे पता चलता है, और यह रत्न का कोड कब लोड करता है?
यह रेल प्रारंभिक दस्तावेज के एक निश्चित खंड में शामिल है। यहाँ प्रासंगिक हिस्सा है:
एक मानक रेल एप्लिकेशन में, एक Gemfile होता है जो एप्लिकेशन की सभी निर्भरताओं की घोषणा करता है। config/boot.rb इस फ़ाइल के स्थान पर ENV['BUNDLE_GEMFILE'] सेट करता है। यदि Gemfile मौजूद है, तो बंडलर/सेटअप की आवश्यकता है।
यह आरंभिक प्रक्रिया में जल्दी होता है:दूसरा चरण, सटीक होना। यह समझ में आता है क्योंकि यदि आपकी परियोजना एक निश्चित मणि पर निर्भर करती है, तो कौन जानता है कि आप इसका संदर्भ कहां दे सकते हैं। इसे जल्द से जल्द लोड करें ताकि इसका कोड कहीं भी इस्तेमाल किया जा सके।