রেলসের সাথে কাজ করার চমৎকার দিকগুলোর মধ্যে একটি হলো যেকোনো সাধারণ প্রোগ্রামিং দরকারের জন্য—অথোরাইজেশন, সাইট অ্যাডমিনিস্ট্রেশন, ইকমার্স, আপনি যা নাম দিন—আপনার চেয়ে কেউ বুদ্ধিমান সম্ভবত আপনার সমস্যার সমাধান কোড করে ফেলেছে এবং সেটা একটি জেম হিসেবে প্যাকেজ করে দিয়েছে।
আপনি নিশ্চিতভাবে আপনার Gemfile-এ জেম যোগ করে তাদের সব সুবিধা নিতে পারেন সেটা কীভাবে কাজ করে সেটা না বুঝলেও, কিন্তু কি আপনি কখনো কৌতূহলী হয়েছেন কীভাবে সবকিছু ওয়ায়ার্ড হয়ে যায়?
এখানে আমরা রায়ান বেটসের CanCan অথোরাইজেশন জেমকে নিকট থেকে দেখব এবং নিচের প্রশ্নগুলোর উত্তর দেব (যেগুলো যদি ευহাপেहे पूछा হয়, তবে যেকোনো জেমের জন্য প্রযোজ্য হতে পারে):
CanCan-এর কোড কোথায় সংরক্ষিত হয়?
can?মেথড কোথায় ডিফাইন করা হয়েছে?রেলস কখন/কোথায়/কীভাবে CanCan-এর কোড লোড করে?
প্রথমে, আমার Gemfile-এ 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
এটা প্রশ্ন ১ সমাধান করল। এখন 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
যাপরিচিতি(query) আসলে এখানে কি হচ্ছে, সেটা সম্পর্কে আপনার অনুমানই আমার অনyman। কিন্তু সেটা গুরুত্বপূর্ণ অংশ নয়। টেকঅওয়ে হলো যদি আপনি কোনো জেমের সাথে কোনো সমস্যায় ফসে যান, তবে এখন আপনি সেটার কোডে খনন করার জন্য সক্ষম হয়ে গেলেন কী হচ্ছে সেটা বুঝতে।
এখন আমরা জানি একটি জেমের কোড কোথায় থাকে এবং কীভাবে সেটাতে ঢুকতে হয়, রেলস কীভাবে একটি জেম সম্পর্কে জানে, এবং কখন এটি একটি জেমের কোড লোড করে?
এটা রেলস ইনিশিয়ালাইজেশন ডকুমেন্টেশনের একটি নির্দিষ্ট সেকশনে কভার করা আছে। এখানে প্রাসঙ্গিক অংশটি:
একটি স্ট্যান্ডার্ড রেলস অ্যাপ্লিকেশনে, একটি Gemfile থাকে যা অ্যাপ্লিকেশনের সব ডিপেন্ডেন্সি ডিক্লেয়ার করে। config/boot.rb ENV['BUNDLE_GEMFILE'] সেট করে এই ফাইলের লোকেশনে। যদি Gemfile অস্তিত্বে থাকে, তবে bundler/setup রিকোয়ার করা হয়।
এটি ইনিশিয়ালাইজেশন প্রসেসের খুব শুরুর দিকে ঘটে: দ্বিতীয় ধাপ, সঠিক বলতে। এটা মেনে যাওয়া যাক যেহেতু আপনার প্রজেক্ট একটি নির্দিষ্ট জেমের ওপর ডিপেন্ডেন্ট, কে জানে আপনি কোথায় সেটা রেফারেন্স দিতে পারেন। তাই যত দ্রুত সম্ভব লোড করা ভালো যাতে এর কোড যেকোনো জায়গা থেকে ব্যবহার করা যায়।