W jaki sposób chciałbym zdefiniować umiejętności dla kilku modeli?Jak zintegrować CanCan z wieloma modelami devise?
Odpowiedz
Obecny model użytkownik przechodzi do Ability#initialize
, więc można po prostu sprawdzić swoją klasę:
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
ten pracował dla mnie -
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
Załóżmy aplikację posiada dwa oddzielne Devise- zasilane modele użytkowników o nazwach User
i Admin
. Oznacza to, że używasz metod obok siebie, takich jak current_user
i current_admin
.
Chodźmy dalej zakładać, że masz tylko/chcesz pojedynczego Ability
klasę, która zawiera wszystkie CanCan ustawienia uprawnień ...
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
To jest dokładnie to, co inni proponują, ale jest kolejny krok trzeba brać.
Domyślnie CanCan przyjmuje, że istnieje metoda current_user
i zwróci obiekt użytkownika w celu porównania z ustawieniami Ability
. Jednak nasi administratorzy można znaleźć za pomocą current_admin
. Nie informując CanCan, gdzie znaleźć obiekty administracyjne, nigdy nie zostaną sprawdzone, a tym samym nigdy nie uzyskają uprawnień; musimy zmienić ustawienia domyślne, gdy mamy do czynienia z administratorem.
Dodaj poniższe linie do 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
Teraz nasza klasa Umiejętność będzie wyglądać na obiekt administratora, jeśli jest dostępny, i spaść z powrotem na zwykły użytkownik, gdy żaden nie jest obecny.
Dalszy rozwój pozwala nam przenieść uprawnienia administratora w oddzielnym klasie zdolność ...
def current_ability
if admin_signed_in?
@current_ability ||= AdminPowers.new(current_admin)
else
@current_ability ||= Ability.new(current_user)
end
end
Aby uzyskać więcej informacji, zobacz Changing Defaults w Wiki. Kudos do Stefan za wskazanie mi odpowiedniego artykułu.
FYI - CanCan nie żyje, niech żyje CanCanCan! Na bieżąco z poprawionymi błędami i nowymi funkcjami. Te same przestrzenie nazw, więc jest to po prostu drop-in gem replacement w twoim Gemfile.
gem 'cancancan', '~> 1.8'
po przeszukaniu znalazłem w końcu kompletną odpowiedź – coderVishal
Dziękuję Stefan. Niestety, wydaje się, że nie działa. Obowiązuje tylko przypadek użytkownika, ale nie administrator. Za każdym razem, gdy loguję się jako administrator, mam tylko uprawnienia gościa. Prawdopodobnie robię coś złego, ale nie mogę dojść do tego. – user1464499
Być może 'Ability # initialize' nie jest wywoływane dla twojego admina. Dodaj rejestrację i sprawdź [Zmiana domyślnych] (https://github.com/ryanb/cancan/wiki/Changing-Defaults). – Stefan