2012-06-18 10 views

risposta

1

Il modello utente corrente viene passato al Ability#initialize, in modo da poter resta che verificare la classe:

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

Grazie Stefan. Sfortunatamente, non sembra funzionare. Si applica solo il caso Utente e altro ma non l'Amministratore. Ogni volta che accedo come amministratore, ho solo privilegi di ospite. Probabilmente sto facendo qualcosa di sbagliato ma non riesco a capirlo. – user1464499

+1

Forse 'Ability # initialize' non viene chiamato per l'amministratore. Aggiungi un po 'di registrazione e controlla [Modifica dei valori predefiniti] (https://github.com/ryanb/cancan/wiki/Changing-Defaults). – Stefan

1

Questo ha funzionato per me -

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

Supponiamo vostra applicazione ha due Devise- separata modelli utente alimentati chiamati User e Admin. Ciò significa che si utilizzano metodi come current_user e current_admin affiancati.

Diamo inoltre supporre che avete/volete un unico Ability classe, che contiene tutte le impostazioni di autorizzazione Cancan solo ...

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 

Questo è esattamente ciò che gli altri hanno proposto, ma c'è un altro passo che devi prendere.

Per impostazione predefinita, CanCan presuppone che il metodo current_user esista e restituisca un oggetto Utente da confrontare con le impostazioni Ability. Tuttavia, i nostri utenti amministratori possono essere trovati utilizzando current_admin. Senza dire a CanCan dove trovare gli oggetti di amministrazione, essi non vengono mai esaminati e quindi non ottengono mai le autorizzazioni; dobbiamo cambiare i valori di default quando ci occupiamo di un amministratore.

Aggiungere il seguente alla 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 

Ora la nostra classe Ability esaminerà l'oggetto Admin, se disponibile, e ripiegare su un utente normale quando nessuno è presente.

ulteriore sviluppo ci permette di spostare le autorizzazioni di amministratore nella propria classe diversa abilità ...

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

Per ulteriori informazioni, vedere Changing Defaults nel Wiki. Complimenti a Stefan per avermi indicato l'articolo corretto.

FYI - CanCan è morto, lunga vita CanCanCan! Aggiornato con correzioni di bug e nuove funzionalità. Stessi spazi dei nomi, quindi è solo una sostituzione gemma drop-in nel tuo Gemfile.

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

dopo la ricerca ho finalmente trovato la risposta completa – coderVishal