2012-06-18 16 views

Antwort

1

Das aktuelle Benutzer Modell zum Ability#initialize übergeben wird, so kann man seine Klasse einfach überprüfen:

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

Danke Stefan. Leider scheint es nicht zu funktionieren. Es gilt nur der Benutzerfall und sonst nicht der Admin. Immer wenn ich mich als Administrator anmelde, habe ich nur Gastprivilegien. Wahrscheinlich mache ich etwas falsch, aber ich kann nicht herausfinden. – user1464499

+1

Vielleicht wird 'Fähigkeit # initialisieren' nicht für Ihren Administrator aufgerufen. Fügen Sie eine Protokollierung hinzu und überprüfen Sie [Standardeinstellungen ändern] (https://github.com/ryanb/cancan/wiki/Changing-Defaults). – Stefan

1

Das ist für mich gearbeitet -

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

Lassen Sie sich Ihre Anwendung separate Devise- hat zwei übernehmen powered Benutzermodelle genannt User und Admin. Das bedeutet, dass Sie Methoden wie current_user und current_admin nebeneinander verwenden.

Lassen Sie uns weiter annehmen, dass Sie nur haben/wollen eine einzige Ability-Klasse, die alle Ihre CanCan Berechtigungseinstellungen enthält ...

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 

Das ist genau das, was andere vorgeschlagen haben, aber es ist ein weiterer Schritt, den Sie müssen nehmen.

CanCan geht standardmäßig davon aus, dass die Methode current_user existiert und gibt ein Benutzerobjekt zurück, das mit Ihren Ability Einstellungen verglichen werden kann. Unsere Admin-Benutzer können jedoch unter current_admin gefunden werden. Ohne CanCan zu sagen, wo Admin-Objekte zu finden sind, werden sie nie überprüft und erhalten somit nie Berechtigungen; müssen wir die Standardeinstellungen ändern, wenn wir mit einem Admin umgehen.

Fügen Sie den folgenden zu 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 

Jetzt im Admin-Objekt unserer Fähigkeit Klasse aussehen wird, wenn ein solcher vorhanden ist, und wieder auf einem normalen Benutzer fallen, wenn keiner vorhanden ist.

Weiterentwicklung ermöglicht es uns, Admin-Berechtigungen in ihre eigene separate Fähigkeit Klasse ...

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

Für weitere Informationen zu bewegen, sehen Changing Defaults im Wiki. Kudos zu Stefan für mich auf den richtigen Artikel.

FYI - CanCan ist tot, es lebe CanCanCan! Aktuell mit Bugfixes und neuen Funktionen. Die gleichen Namespaces, also ist es nur ein Drop-in-Juwel Ersatz in Ihrer Gemfile.

+1

Nach der Suche fand ich endlich die vollständige Antwort – coderVishal

Verwandte Themen