2011-10-26 18 views
10

Mi chiedevo come posso definire una classe capacità e servire quella classe capacità a seconda dell'utente che ha effettuato l'accesso.Rails Can Can Capacità Classe diversi modelli Devise

sto usando Admin attivo, Can Can e mettere a punto e ho creato con successo un utente e un modello AdminUser.

ho questo nel mio ability.rb

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    user ||= User.new 

    if (user) 
     can :manage, Item 
    end 
    end 
end 

Ora ho usato questa voce wiki per determinare che possiamo davvero definire un file personalizzato capacità e l'uso che al posto del ability.rb:

https://github.com/ryanb/cancan/wiki/changing-defaults

Ma quello che volevo fare è, in grado di utilizzare ability.rb se un "utente non-admin" è firmato in un costume e abilty se un utente admin viene effettuato.

Domanda laterale: Potrebbe essere eseguito in modo tale che non è necessario uno personalizzato e potrei impostare le autorizzazioni in un file ability.rb?

+0

Ah, hai ragione. Non ho notato che avevi usato una classe separata per Utente e Amminente. Dovresti essere in grado di modificare la classe utilizzata da Active Admin, ma non essendo un utente di quel sistema, non sono sicuro di dove sia esattamente. Probabilmente dovresti controllare i tuoi inizializzatori. – jdl

risposta

12

Non ho mai realmente utilizzato ActiveAdmin, quindi non sono del tutto sicuro se mi manca qualcosa, ma non sembra che il framework si basi su CanCan. Questo è il motivo per cui presumo che tu stia definendo un metodo current_ability come spiegato nel wiki e viene istanziato con Ability.new(current_user).

Se questo è il caso, e la vostra current_user può essere o un User o un AdminUser, quindi non c'è nessun problema nel controllo per quella nella classe Ability:

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    user ||= User.new 

    if user.kind_of? AdminUser 
     can :manage, Item 
    elsif user.kind_of? User 
     can :read, Item 
    end 
    end 
end 

Si può semplicemente dare un'occhiata al l'utente del digita e modifica le regole di conseguenza. È anche possibile utilizzare is_a? anziché kind_of? per un controllo più rigoroso, ma probabilmente non è necessario e potrebbe causare problemi se si decide di eseguire l'ereditarietà in un secondo momento.

Un altro modo per verificare è definire un metodo admin? in entrambi i modelli. Questo potrebbe essere un modo migliore per farlo, dal momento che il controllo esplicito dei tipi non è molto popolare in ruby ​​- spesso limita le tue scelte. Potrebbe essere il seguente:

class User < ActiveRecord::Base 
    def admin? 
    false 
    end 
end 

class AdminUser < ActiveRecord::Base 
    def admin? 
    true 
    end 
end 

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    user ||= User.new 

    if user.admin? 
     can :manage, Item 
    else 
     can :read, Item 
    end 
    end 
end