Birkaç model için yetenekleri tanımlamaya nasıl giderim?CanCan çoklu model modelleri ile nasıl entegre edilir?
cevap
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
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
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'
nihayet tam cevabı buldum – coderVishal
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
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