अस्वीकरण: सादगी के लिए, मैं जानबूझकर छोटी आंतरिक विधियों को कुछ कॉल छोड़ देता हूं। कॉलिंग की पूरी श्रृंखला load_and_authorize_resource
विधि परिभाषा और आगे के बाद प्राप्त की जा सकती है।
के रूप में दस्तावेज में कहा गया है, load_and_authorize_resource
ऊपर एक before_filter
# cancan/lib/cancan/controller_additions.rb
def load_and_authorize_resource(*args)
cancan_resource_class.add_before_filter(self, :load_and_authorize_resource, *args)
end
तय करता है ... ... जो दो तरीकों कॉल: load_resource
और authorize_resource
।
# cancan/lib/cancan/controller_resource.rb
def load_and_authorize_resource
load_resource
authorize_resource
end
उनके व्यवहार का विचार पाने के लिए हम दोनों को बारीकी से देखने जा रहे हैं।
params
हैश जो अपने नियंत्रक कार्रवाई करने के लिए पारित किया गया था के आधार पर, load_resource
कि क्या यह एक श्रेणी (उदाहरण Post.new
) या find
एक विशेष उदाहरण पर params[:id]
(जैसे Post.find(params[:id])
) आधारित का एक नया उदाहरण प्राप्त करना चाहिए पर निर्णय लेता है। उस उदाहरण (या index
जैसे कार्यों के उदाहरणों का संग्रह) आपके नियंत्रक कार्रवाई के संबंधित आवृत्ति चर को असाइन किया गया है।
# cancan/lib/cancan/controller_resource.rb
def load_resource
unless skip?(:load)
if load_instance?
# here you have obtained your object, e.g. Post with id=5
# and placed it into cancan resource_instance variable.
# it has automatically set up @post instance variable for you
# in your action
self.resource_instance ||= load_resource_instance
elsif load_collection?
self.collection_instance ||= load_collection
end
end
end
बाद में, authorize_resource
कॉल किया जाता है। इसके आंतरिक तर्क वाक्यविन्यास आपको परिचित होना चाहिए: हाथों से क्षमताओं की जांच करना इस विधि के अंदर क्या होता है जैसा दिखता है। मूल रूप से आप पिछले चरण, params[:action]
पर प्राप्त resource_instance
लेते हैं जो वर्तमान क्रिया का नाम है, और जांचें कि दिए गए ऑब्जेक्ट के लिए विशेष कार्रवाई का उपयोग किया जा सकता है या नहीं।
# cancan/lib/cancan/controller_resource.rb
def authorize_resource
unless skip?(:authorize)
# similar to what happens when you call authorize!(:show, @post)
@controller.authorize!(authorization_action, resource_instance || resource_class_with_parent)
end
end
जब तक before_filter
के अंदर अपवादों को ऊपर उठाने के रूप में क्रियान्वित किया जा रहा है, यहाँ प्राधिकरण पारित आप अपने आवेदन के घर यूआरएल के लिए पुनः निर्देशित हो जाता करने में नाकाम रहने से नियंत्रक कार्रवाई बंद हो जाता है, पता चला 500 त्रुटि पृष्ठ या जो भी व्यवहार आप CanCan::AccessDenied
से निपटने के लिए परिभाषित किया।
दूसरी तरफ, यदि आप सफलतापूर्वक प्रमाणीकरण पास कर चुके हैं, तो आपका एक्शन कोड निष्पादित हो जाता है। अब आपको इंस्टेंस वैरिएबल तक पहुंच मिली है (उदा। @post
) जिसे CanCan
load_resource
चरण पर स्थापित किया गया है।
धन्यवाद! तुम मेरी बहुत मदद करो! – Vito
यह कैसे पता चलता है कि संग्रह लाने या उदाहरण बनाने या लोड करने के लिए? – mwfearnley