2012-06-18 10 views

Respuesta

1

El modelo de usuario actual se pasa a la Ability#initialize, por lo que se acaba de comprobar su clase:

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

Gracias Stefan. Desafortunadamente, no parece estar funcionando. Aplica solo el caso del Usuario y de otro modo, pero no el Administrador. Cada vez que inicio sesión como administrador solo tengo privilegios de invitado. Probablemente estoy haciendo algo mal, pero no puedo entenderlo. – user1464499

+1

Tal vez 'Ability # initialize' no se llame para su administrador. Agregue un poco de registro y eche un vistazo a [Cambiar los valores predeterminados] (https://github.com/ryanb/cancan/wiki/Changing-Defaults). – Stefan

1

Esto funcionó para mí -

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

Supongamos que su aplicación tiene dos Devise- separada modelos de usuario con alimentación llamados User y Admin. Esto significa que utiliza métodos como current_user y current_admin uno al lado del otro.

Let de más suponer que sólo tiene/quiere una sola clase Ability, que contiene todas las configuraciones de los permisos CanCan ...

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 

Esto es exactamente lo que otros han propuesto, pero hay otro paso que tiene que tomar.

De forma predeterminada, CanCan supone que existe el método current_user y devolverá un objeto Usuario para compararlo con su configuración Ability. Sin embargo, nuestros usuarios administradores se pueden encontrar usando current_admin. Sin decirle a CanCan dónde encontrar los objetos de administración, nunca se revisan y, por lo tanto, nunca obtienen permisos; debemos cambiar los valores predeterminados cuando se trata de un administrador.

Agregue lo siguiente al 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 

Ahora nuestra clase Capacidad mirará el objeto de administración, si está disponible, y entrar de nuevo en un usuario normal cuando no está presente.

Un mayor desarrollo nos permite mover permisos de administrador en su propia clase Capacidad separada ...

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

Para obtener más información, consulte Changing Defaults en el Wiki. Felicitaciones a Stefan por señalarme el artículo correcto.

FYI - CanCan está muerto, viva CanCanCan! Actualizado con correcciones de errores y nuevas funciones. Los mismos espacios de nombres, por lo que solo se trata de un reemplazo de gemas en su Gemfile.

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

después de buscar finalmente encontré la respuesta completa – coderVishal

Cuestiones relacionadas