6

के अलावा नामस्थान में load_and_authorize_resource मैं अपने रेल एप्लिकेशन में अनुमतियों के लिए कैनकन का उपयोग कर रहा हूं जिसमें मैंने कुछ सामान्य रूप कार्यक्षमता के लिए अपना इंजन बनाया है। मैं अपने सिस्टम में अनुमतियों को लॉक करना चाहता हूं ताकि उपयोगकर्ता स्वतंत्र रूप से मेरे इंजन नियंत्रकों के कार्यों तक पहुंच न सकें। अधिकांश नियंत्रकों के लिए, ये नियंत्रक, केवल 7 REST क्रियाओं का उपयोग करते हैं, इसलिए मैं प्रत्येक नियंत्रक के शीर्ष पर कैनकन के load_and_authorize_resource का उपयोग करना चाहता हूं।कैनकन: मेनएप

हालांकि, जब मैं इस तरह मेरे कोड लिखने:

module MyEngine 
     class FormController < ApplicationController 
     load_and_authorize_resource 
     ... 
     end 
    end 

मैं इस त्रुटि मिलती है:

uninitialized constant Form 

मेरा अनुमान है कि load_and_authorize_resource में स्वत: लोडर मेरी MainApp नाम स्थान के लिए, बंधा हुआ है और यह नहीं पहचानता कि मैं इसे एक अलग नामस्थान में बुला रहा हूं, और MyEngine::Form.find(params[:id]) की बजाय Form.find(params[:id]) जैसे कॉल करता है।

यदि ऐसा है, तो मैं इसे कैसे ठीक कर सकता हूं? यह एक बड़ा सौदा नहीं है क्योंकि authorize! अभी भी ठीक से काम करता है, इसलिए मैं व्यक्तिगत रूप से प्रत्येक क्रिया में प्रमाणीकरण को परिभाषित कर सकता हूं, लेकिन अगर मैं load_and_authorize_resource विधि का उपयोग करने में सक्षम था तो यह बहुत साफ महसूस करेगा।

+0

संभावित डुप्लिकेट [कैनकन का उपयोग करके नामित और नेस्टेड नियंत्रकों को अधिकृत करना] (http://stackoverflow.com/questions/12334367/authorizing-namespaced-and-nested-controllers-using-cancan) –

उत्तर

6

यह CanCan::ControllerResource#namespace में एक बग हो रहा है:

def namespace 
    @params[:controller].split("::")[0..-2] 
end 

जैसा कि आप देख, यह :: द्वारा नियंत्रक पथ विभाजित करने की कोशिश करता है, लेकिन यह my_engine/my_controller के रूप में आता है।

तो ठीक गूंगा सरल है:

def namespace 
    @params[:controller].split("/")[0..-2] 
end 

आश्चर्य है कि कैसे वे इतने लंबे समय के लिए इस तरह के एक बेवकूफ बग याद कर सकता है। उन्हें एक पुल अनुरोध भेज देंगे।

पीएस जवाब देने के लिए अभी साइन अप किया है 8)

+1

ओह! यह और भी दिलचस्प है: वे बस 'मास्टर' शाखा में फिक्स विलय करना भूल जाते हैं। https://github.com/ryanb/cancan/issues/663 –

+0

अच्छा, यह वही था जो मुझे चाहिए था! –

+1

इसके लिए एक पैच लागू किया गया था [1.6.10] (https://github.com/ryanb/cancan/pull/675) –

8

कैनकन नामित मॉडल नहीं ढूंढ सकता है। वर्ग निर्दिष्ट करने के लिए प्रयास करें: मॉडल वर्ग नियंत्रक की तुलना में अलग namespaced है

load_and_authorize_resource class: MyEngine::Form 
3

हैं, तो आप :class विकल्प निर्दिष्ट करने की आवश्यकता होगी।

module MyEngine 
    class FormController < ApplicationController 
    load_and_authorize_resource :class => MyEngine::Form 
    ... 
    end 
end 
+0

मुझे इसके लिए 'अनियमित स्थिर माईइंजिन :: फॉर्म' मिल रहा है। – hlcs

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