2013-02-21 11 views
6

Użytkownik może należeć do wielu organizacji. Chciałbym, aby Użytkownik mógł mieć przypisane różne role/uprawnienia dla każdej organizacji, do której należy.Szyny: Używanie CanCan do przypisywania wielu ról do użytkowników dla każdej organizacji, do której należą?

Na przykład użytkownik "kevin" może należeć do organizacji "stackoverflow" i "facebook". kevin powinien być administratorem dla stackoverflow, a zwykły członek (czytać i pisać) dla Facebooka.

Jednak klejnot CanCan wydaje się adresować role użytkowników tylko dla jednej organizacji. Nadal jestem początkującym, ale z tego, co mogę zebrać, klejnot CanCan zakłada, że ​​role użytkowników są powiązane tylko z główną aplikacją.

Jak mogę przypisać oddzielne role dla różnych organizacji, najlepiej przy użyciu klejnotu CanCan?

Odpowiedz

8

Myślisz, że trzeba zapisać role jako pole ciągu w modelu użytkownika. Nie musisz wcale:

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

Próbowałem zastosować to, ale nadal mam problemy. Byłbym wdzięczny za pomoc: http://stackoverflow.com/questions/18482747/rails-how-to-split-separate-cancan-roles-user-has-many-roles-depending-on-sin – kibaekr

2

Mamy coś takiego. rozwiązaniem jest nadpisanie metody current_ability. w twoim przypadku prawdopodobnie masz tabelę dołączania dla użytkowników i organizacji. nazwijmy to user_organizations. W tej tabeli łączenia prawdopodobnie przechowujesz także rolę użytkownika dla konkretnej organizacji, prawda? Skorzystajmy więc z tej tabeli, aby zdefiniować obecną zdolność. W kontroler aplikacji

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 

nadzieję, że to daje pewne wyobrażenie

Powiązane problemy