2013-02-21 11 views
6

एक उपयोगकर्ता कई संगठनों से संबंधित हो सकता है। मैं चाहता हूं कि उपयोगकर्ता प्रत्येक संगठन के लिए अलग-अलग भूमिकाओं/प्राधिकरणों को सौंपा जा सके।रेल: प्रत्येक संगठन के लिए उपयोगकर्ताओं को एकाधिक भूमिका निभाने के लिए कैनकन का उपयोग करना?

उदाहरण के लिए, उपयोगकर्ता "केविन" संगठन "स्टैक ओवरफ्लो" और "फेसबुक" से संबंधित हो सकता है। केविन स्टैक ओवरफ्लो के लिए एक व्यवस्थापक बनने में सक्षम होना चाहिए, और फेसबुक के लिए नियमित सदस्य (पढ़ना + लिखना) होना चाहिए।

हालांकि, कैनकन मणि केवल एक संगठन के लिए उपयोगकर्ता भूमिकाओं को संबोधित करने लगता है। मैं अभी भी एक नौसिखिया हूं, लेकिन जो मैं इकट्ठा कर सकता हूं, कैनकन मणि मानता है कि उपयोगकर्ता भूमिका केवल मुख्य ऐप से बंधे हैं।

मैं अलग-अलग संगठनों के लिए अलग-अलग भूमिकाएं कैसे सौंप सकता हूं, अधिमानतः कैनकन मणि का उपयोग कर सकता हूं?

उत्तर

8

आप सोच रहे हैं आप उपयोगकर्ता मॉडल में एक स्ट्रिंग क्षेत्र के रूप में भूमिका निभाने को बचाने के लिए है कि देता है। आपको बिलकुल भी नहीं है:

class User 
    has_many :roles 
end 

class Role 
    belongs_to :user 
    belongs_to :organization 
    attr_accessible :level 
end 

class Ability 
    def initialize(user) 
    can :read, Organization 
    can :manage, Organization do |organization| 
     user.roles.where(organization_id:organization.id,level:'admin').length > 0 
    end 
    can :write, Organization do |organization| 
     user.roles.where(organization_id:organization.id,level:'member').length > 0 
    end 
    end 
end 
+0

मैंने इसे लागू करने का प्रयास किया है लेकिन मुझे अभी भी समस्या है। मैं वास्तव में मदद की सराहना करता हूं: http://stackoverflow.com/questions/18482747/rails-how-to-split-separate-cancan-roles-user-has-many-roles-depending-on-sin – kibaekr

2

हमारे पास ऐसा कुछ है। समाधान वर्तमान_एबिलिटी विधि को ओवरराइड करना है। आपके मामले में, आपके पास शायद उपयोगकर्ता और संगठन के लिए एक टेबल शामिल हो। आइए user_organizations पर कॉल करें। इस तालिका में शामिल होने पर, आप शायद किसी विशेष संगठन के लिए उपयोगकर्ता की भूमिका भी संग्रहीत कर सकते हैं, है ना? तो वर्तमान क्षमता को परिभाषित करने के लिए उस तालिका का उपयोग करें। आपके आवेदन नियंत्रक

def current_ability 
    # assuming you have a current_user and current_organization method 
    Ability.new UserOrganization.where(user_id: current_user.id, organization_id: current_organization.id).first 
end 

# ability.rb 
class Ability 
    include CanCan::Ability 
    def initialize(user_organization) 
    user_organization ||= UserOrganization.new 

    case user_organization.role 
    when 'admin' 
    when '...' 
    when nil 
     # for users not a member of the organization 
    end 
    end 
end 

आशा में इस आप कुछ विचार

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

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