2015-06-15 3 views
8

के कैनकन स्पष्टीकरण मुझे पता होगा कि load_and_authorize_resource अंदर कैसे काम करता है। मैंने जिथब पेज Link की खोज की और अनावश्यक करने की कोशिश की, लेकिन मुझे कुछ भी उपयोगी नहीं मिला। मैं केवल यह समझता हूं कि load_and_authorize_resource पहले_फिल्टर की तरह है और यह क्षमता (आरआरload_and_authorize_resource

पर बेहतर क्षमता को लोड करता है, मैं बेहतर जानता हूं कि यह कैसे संभव है। मेरा मतलब है, मैं सभी मणि का अध्ययन नहीं करना चाहता, लेकिन मैं सिर्फ यह देखना चाहता हूं कि नियंत्रक में संसाधन की क्षमता को कैसे लोड किया जा सकता है और यदि load_and_authorize_resource वास्तव में पहले_फिल्टर का एक प्रकार है।

उत्तर

11

अस्वीकरण: सादगी के लिए, मैं जानबूझकर छोटी आंतरिक विधियों को कुछ कॉल छोड़ देता हूं। कॉलिंग की पूरी श्रृंखला 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) जिसे CanCanload_resource चरण पर स्थापित किया गया है।

+0

धन्यवाद! तुम मेरी बहुत मदद करो! – Vito

+1

यह कैसे पता चलता है कि संग्रह लाने या उदाहरण बनाने या लोड करने के लिए? – mwfearnley

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