2011-10-26 13 views
10

Me preguntaba cómo puedo definir una clase de capacidad y servir a esa clase de capacidad en función del usuario que ha iniciado sesión.rieles Can Can Capacidad de clase para múltiples modelos Idear

que estoy usando administración activa, Can Can y diseñar y he creado con éxito un usuario y un administrador de usuarios modelos.

tengo esto en mi ability.rb

class Ability 
    include CanCan::Ability 

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

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

Ahora he utilizado esta entrada wiki para determinar que, efectivamente, podemos definir un archivo de capacidad costumbre y el uso que en lugar de la ability.rb:

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

Pero lo que quería hacer es, ser capaz de utilizar ability.rb si un "no-usuario admin" y se firma en una costumbre abilty si un usuario admin se ha iniciado sesión.

Pregunta complementaria: ¿Podría hacerse de manera que no necesite una personalizada y podría establecer permisos en un archivo ability.rb?

+0

Ah, tienes razón. No noté que había usado una clase separada para Usuario y Administrador. Debería poder cambiar la clase utilizada por Active Admin, pero no ser usuario de ese sistema, no estoy seguro exactamente de dónde es eso. Sin embargo, probablemente debería verificar tus inicializadores. – jdl

Respuesta

12

Nunca he usado ActiveAdmin realmente, así que no estoy del todo seguro de si me falta algo, pero no parece que ese framework se base en CanCan. Es por eso que asumo que estás definiendo un método current_ability como se explica en la wiki y se crea una instancia con Ability.new(current_user).

Si ese es el caso, y su current_user puede ser o bien un User o un AdminUser, entonces no hay ningún problema en la comprobación de que en la clase 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 

Usted puede simplemente echar un vistazo al usuario de escriba y cambie las reglas en consecuencia. También puede usar is_a? en lugar de kind_of? para realizar comprobaciones más estrictas, pero probablemente no sea necesario y podría causar problemas si decide realizar la herencia más adelante.

Otra forma de comprobarlo es definiendo un método admin? en ambos modelos. Esta podría ser una mejor manera de hacerlo, ya que la comprobación de tipos explícita no es muy popular en ruby, a menudo limita tus elecciones. Podría verse así:

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 
Cuestiones relacionadas