2012-06-18 7 views

Odpowiedz

1

Obecny model użytkownik przechodzi do Ability#initialize, więc można po prostu sprawdzić swoją klasę:

class Ability 
    include CanCan::Ability 

    def initialize(model) 
    case model 
    when Admin 
     can :manage, :all 
    when User 
     can :create, Comment 
     can :read, :all 
    else 
     can :read, :all 
    end 
    end 
end 
+0

Dziękuję Stefan. Niestety, wydaje się, że nie działa. Obowiązuje tylko przypadek użytkownika, ale nie administrator. Za każdym razem, gdy loguję się jako administrator, mam tylko uprawnienia gościa. Prawdopodobnie robię coś złego, ale nie mogę dojść do tego. – user1464499

+1

Być może 'Ability # initialize' nie jest wywoływane dla twojego admina. Dodaj rejestrację i sprawdź [Zmiana domyślnych] (https://github.com/ryanb/cancan/wiki/Changing-Defaults). – Stefan

1

ten pracował dla mnie -

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    if user.is_a?(Admin) 
     can :manage, :all 
    elsif user.is_a?(User) 
     can :create, Comment 
     can :read, :all 
    else 
     can :read, :all 
    end 
    end 
end 
10

Załóżmy aplikację posiada dwa oddzielne Devise- zasilane modele użytkowników o nazwach User i Admin. Oznacza to, że używasz metod obok siebie, takich jak current_user i current_admin.

Chodźmy dalej zakładać, że masz tylko/chcesz pojedynczego Ability klasę, która zawiera wszystkie CanCan ustawienia uprawnień ...

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    user ||= User.new 
    case user 
    when User 
     can :create, Comment 
     can :read, :all 
    when Admin 
     can :manage, :all 
    end 
    end 
end 

To jest dokładnie to, co inni proponują, ale jest kolejny krok trzeba brać.

Domyślnie CanCan przyjmuje, że istnieje metoda current_user i zwróci obiekt użytkownika w celu porównania z ustawieniami Ability. Jednak nasi administratorzy można znaleźć za pomocą current_admin. Nie informując CanCan, gdzie znaleźć obiekty administracyjne, nigdy nie zostaną sprawdzone, a tym samym nigdy nie uzyskają uprawnień; musimy zmienić ustawienia domyślne, gdy mamy do czynienia z administratorem.

Dodaj poniższe linie do application_controller.rb ...

def current_ability 
    if admin_signed_in? 
    @current_ability ||= Ability.new(current_admin) 
    else 
    @current_ability ||= Ability.new(current_user) 
    end 
end 

Teraz nasza klasa Umiejętność będzie wyglądać na obiekt administratora, jeśli jest dostępny, i spaść z powrotem na zwykły użytkownik, gdy żaden nie jest obecny.

Dalszy rozwój pozwala nam przenieść uprawnienia administratora w oddzielnym klasie zdolność ...

def current_ability 
    if admin_signed_in? 
    @current_ability ||= AdminPowers.new(current_admin) 
    else 
    @current_ability ||= Ability.new(current_user) 
    end 
end 

Aby uzyskać więcej informacji, zobacz Changing Defaults w Wiki. Kudos do Stefan za wskazanie mi odpowiedniego artykułu.

FYI - CanCan nie żyje, niech żyje CanCanCan! Na bieżąco z poprawionymi błędami i nowymi funkcjami. Te same przestrzenie nazw, więc jest to po prostu drop-in gem replacement w twoim Gemfile.

gem 'cancancan', '~> 1.8' 
+1

po przeszukaniu znalazłem w końcu kompletną odpowiedź – coderVishal