Witam, z tego co się zorientowałem CanCan całkiem fajnie wspiera dziedziczenie ról dla całych klas https://github.com/ryanb/cancan/wiki/Role-Based-Authorization dział Role Inheritance. Niestety gdy przychodzi do obiektów już jest trudniej. Mam z grubsza takią zależnośc chains <-- outlets
a do tego prawa wyglądają tak admins <-- chain managers <-- outlet_managers <-- sellers.
Jak w widać w kodzie poniżej, chain_manager może edytować dane outletów które są w jego sieci itd.
Już dla tych paru modeli widać że kod jest mało DRY, boje się że rozrośnie się mocno. Jakieś porady jak zaimplamentować dziedziczenie ról. Czyli np chain manager może zrobić wszystko co outlet manager plus jakies swoje rzeczy.
Nie wiem czy CanCan coś tu ułatwi, bo jak sam autor wspomniał https://github.com/ryanb/cancan/issues/215 implementacja ról wychodzi poza zakres działania gema.
[code=ruby]class Ability
include CanCan::Ability
def initialize(user)
@user = user
if user.role? :admin
can :manage, :all
elsif user.role? :chain_manager
can :manage, Chain do |chain|
chain.chain_managers.include?(@user)
end
can :manage, Outlet do |outlet|
outlet.chain.chain_managers.include?(@user)
end
elsif user.role? :outlet_manager
can :manage, Outlet do |outlet|
outlet.outlet_managers.include?(@user)
end
elsif @user.role? :seller
can :read, Outlet do |outlet|
outler.sellers.include?(@user)
end
end
end
end[/code]