2013-02-21 24 views
6

Un utente può appartenere a molte organizzazioni. Vorrei che l'Utente potesse essere assegnato a diversi ruoli/autorizzazioni per ciascuna delle organizzazioni a cui appartiene.Rails: utilizzare CanCan per assegnare più ruoli agli utenti per ciascuna organizzazione a cui appartengono?

Ad esempio, l'utente "kevin" può appartenere all'organizzazione "stackoverflow" e "facebook". kevin dovrebbe essere un amministratore per stackoverflow e un membro regolare (leggi + scrivi) per facebook.

Tuttavia, la gemma CanCan sembra solo indirizzare i ruoli utente per una singola organizzazione. Sono ancora un principiante, ma da quello che posso raccogliere, la gemma CanCan presume che i ruoli degli utenti siano legati solo all'app principale.

Come potrei essere in grado di assegnare ruoli separati per diverse organizzazioni, preferibilmente utilizzando la gemma CanCan?

risposta

8

Stai pensando che si deve salvare i ruoli come un campo stringa nel modello User. Non è necessario, per niente:

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

Ho provato ad applicarlo ma ho ancora problemi. Apprezzerei molto l'aiuto: http://stackoverflow.com/questions/18482747/rails-how-to-split-separate-cancan-roles-user-has-many-roles-depending-on-sin – kibaekr

2

abbiamo qualcosa di simile. la soluzione è sovrascrivere il metodo current_ability. nel tuo caso, probabilmente hai una tabella di join per utenti e organizzazione. chiamiamolo user_organizations. In questa tabella di join, probabilmente si memorizza anche il ruolo dell'utente per una particolare organizzazione, giusto? Quindi usiamo quella tabella per definire l'abilità corrente. Nel vostro controller applicazione

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 

speranza questo vi dà un'idea