2012-06-18 27 views

cevap

1

geçerli kullanıcı modeli Ability#initialize geçirilir, böylece sadece kendi sınıfını kontrol edebilirsiniz:

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

Teşekkür ederim Stefan. Ne yazık ki, çalışıyor gibi görünmüyor. Yalnızca Kullanıcı örneğini ve başka bir uygulamayı değil, Yönetici'yi uygular. Ne zaman bir yönetici olarak giriş yaptığımda sadece misafir ayrıcalıklarına sahibim. Muhtemelen yanlış bir şey yapıyorum ama anlayamıyorum. – user1464499

+1

Belki de Yöneticiniz için "Yetenek # initialize" çağrılmıyor. Bazı kayıtlar ekleyin ve [Varsayılanları Değiştirme] 'yi kontrol edin (https://github.com/ryanb/cancan/wiki/Changing-Defaults). Aradıktan sonra – Stefan

1

Bu benim için çalıştı -

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

en uygulamanızı varsayalım iki ayrı Devise- vardır Güçlendirilmiş kullanıcı modelleri User ve Admin olarak adlandırılır. Bu, current_user ve current_admin gibi yöntemleri yan yana kullandığınız anlamına gelir. Biraz sert geçebilir ayrıca, yalnızca/var tüm CanCan izin ayarlarını içeren tek Ability sınıf, istediğiniz varsayalım

...

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 

Bu başkalarının önerdi tam olarak ne, ama buna mecbur başka basamak var al. Varsayılan olarak

, CanCan varsa ve bir kullanıcı nesnesi döndürür current_user yöntem Ability ayarlarla karşılaştırmak olduğunu varsayar. Ancak, yönetici kullanıcılarımız current_admin'u kullanarak bulunabilir. CanCan'a yönetici nesneleri nerede bulacağını söylemeden, asla gözden geçirilmezler ve böylece asla izin almazlar; Bir yönetici ile çalışırken varsayılanları değiştirmeliyiz.

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

Varsa Şimdi Yetenek sınıfı Yönetici nesne bakacağız ve hiçbiri mevcut olduğunda geri normal bir kullanıcı düşmek ... application_controller.rb için aşağıdaki ekleyin.

daha da geliştirilmesi ... Daha fazla bilgi için

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

, Wiki Changing Defaults bkz bize kendi ayrı Yetenek sınıfa Yönetici izinleri taşımanızı sağlar. Uygun makalede bana işaret etmek için Stefan için Kudos.

FYI - CanCan öldü, uzun yaşıyor CanCanCan! Hata düzeltmeleri ve yeni özellikler ile güncel. Aynı isim alanları, yani Gemfile'ınızda sadece bir mücevher kutusu değişimi.

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

nihayet tam cevabı buldum – coderVishal