2012-10-05 8 views
6

मैं रेल 3.0.9, कैनकैन 1.6.7 और 1.4.8 वसीयतयह संभव दो क्षमता वर्ग के साथ कैनकैन उपयोग करने के लिए है

मैं अलग लॉग के लिए दो वसीयत मॉडल (उपयोगकर्ता और व्यवस्थापक) का उपयोग कर रहा उपयोग कर रहा हूँ -इन और पंजीकरण प्रक्रिया

इसलिए मैं लॉग इन उपयोगकर्ता (संसाधन) पर निर्भर क्षमताओं को विभाजित करना चाहता हूं, क्योंकि 70 मॉडल से अधिक हैं और केवल 10 मॉडल दोनों प्रकार के उपयोगकर्ताओं के लिए आम हैं (यहां से अधिक 50 मॉडल और विचार केवल व्यवस्थापक उपयोगकर्ताओं द्वारा उपयोग किए जाते हैं)

मैं दो क्षमता वर्ग (उपयोगकर्ता क्षमता और व्यवस्थापक क्षमता) और तैयार करना चाहता हूं सहायक विधि current_user/current_admin UserAbility/AdminAbility को पारित किया जाना चाहिए

उदाहरण:

ApplicationController.rb में दाखिल

def current_ability 
     if current_user 
      @current_ability = UserAbility.new(current_user) 
     elsif current_admin 
      @current_ability = AdminAbility.new(current_admin) 
     end 
    end 

मेरे सवालों का ऊपर से,

  1. कई क्षमता है यदि संभव हो तो कैनकन में कक्षा संभव है तो इसे कैसे बनाया जाए क्योंकि मैंने

    की कोशिश की

    rails g cancan:user_ability

    लेकिन मैं त्रुटि के रूप में जनरेटर कैनकैन नहीं खोजा जा सका है: user_ability

  2. लॉग इन उपयोगकर्ता/व्यवस्थापक के लिए उपयुक्त क्षमता वर्ग का चयन कैसे करें।

  3. एक नियंत्रक दोनों उपयोगकर्ता और व्यवस्थापक द्वारा पहुँचा है, तो मैं कैसे प्राप्त कर सकते हैं वर्तमान में प्रवेश किए उपयोगकर्ता/व्यवस्थापक की वस्तु

इसके लिए किसी अन्य समाधान है?

किसी भी एक कृपया हल करने के लिए मदद इस

उत्तर

12

... ने कहा कि, आप सीधे अगर आप पसंद करते कई क्षमता मॉडल का उपयोग कर सकते हैं:

class UserAbility 
    include CanCan::Ability 

    def initialize(user) 
    can :read, :all 
    end 
end 

class AdminAbility 
    include CanCan::Ability 

    def initialize(admin) 
    can :manage, :all 
    end 
end 

class ApplicationController < ActionController::Base 
    # overriding CanCan::ControllerAdditions 
    def current_ability 
    if current_account.kind_of?(AdminUser) 
     @current_ability ||= AdminAbility.new(current_account) 
    else 
     @current_ability ||= UserAbility.new(current_account) 
    end 
    end 
end 
+0

हाँ मैंने केवल इसके लिए प्रयास किया, लेकिन मैंने एक और कैनकन क्षमता वर्ग बनाने के लिए बहुत कोशिश की लेकिन मैं नहीं कर सकता (मुझे सही वाक्यविन्यास नहीं पता हो सकता है) – nishanthan

+0

आपको किसी की आवश्यकता नहीं है जनरेटर - बस 'ऐप/मॉडलों' में एक नई फ़ाइल बनाएं और 'कैनकन :: क्षमता' शामिल करें। – willglynn

+0

धन्यवाद दोनों ठीक काम करता है – nishanthan

7

आपको लगता है कि के लिए कई क्षमता वर्गों की जरूरत नहीं है:

class Ability 
    include CanCan::Ability 

    def initialize(user_or_admin) 
    user_or_admin ||= User.new 

    common_rules(user_or_admin) 

    if user_or_admin.kind_of? Admin 
     admin_rules(user_or_admin) 
    else 
     user_rules(user_or_admin) 
    end 
    end 

    def common_rules(user_or_admin) 
    # can :verb, :noun 
    end 

    def admin_rules(admin) 
    can :manage, :all 
    end 

    def user_rules(user) 
    can :read, :all 
    end 
end 

कैनकैन अंततः या तो मॉडल के साथ Ability.new() बुला लिया जाएगा, लेकिन वह पूरी तरह से ठीक है, आप के बाद से जांच सकते हैं कि आपको किस प्रकार की वस्तु मिली है। यदि आप चाहें तो आप निश्चित रूप से अन्य वस्तुओं को प्रतिनिधि कर सकते हैं; यह सिर्फ रूबी है।

+0

धन्यवाद, मैं इसके लिए जाना होगा और कृपया मुझे बताओ, यह एक सहायक विधि है जो वर्तमान में ध्यान में रखते हुए लॉग-इन उपयोगकर्ता/व्यवस्थापक की वस्तु रिटर्न हर बार कॉल करने के लिए संभव है या कोई अन्य है इस ऑब्जेक्ट को पाने का तरीका – nishanthan

+0

यह आपके शेष एप्लिकेशन पर निर्भर करता है। यह निश्चित रूप से संभव है, लेकिन मैं आपको कैसे नहीं बता सकता। – willglynn

+0

ठीक है मुझे यह मिला, आपके उत्तर – nishanthan

0

मैं क्या willgiynn has answered को जोड़ना होगा। ऐसा लगता है कि मुझे इसे काम करने के लिए कुछ और कोड जोड़ना पड़ा। मुझे इस post

से उत्तर मिला application_controller में निम्नलिखित जोड़ें।आरबी @willglynn

def current_ability 
    if admin_signed_in? 
     @current_ability ||= Ability.new(current_admin) 
    else 
     @current_ability ||= Ability.new(current_user) 
    end 
end 
संबंधित मुद्दे