我正在使用CanCan在我正在构建的应用程序中使用基于角色的管理系统。它是网上商店的一种模板,因此管理员可以在他/她有权访问的每个网上商店中拥有不同的角色。例如:在网店1中,他是主持人,在网店2中,他是编辑。
所以我在CanCan的能力类中需要做的是检查当前用户在当前商店(current_shop)中的角色。我写了这个:
class Ability
include CanCan::Ability
def initialize(admin)
if admin.supervise?(current_shop, controller_gsub)
can :manage, :all
elsif admin.manage?(current_shop, controller_gsub)
can :manage, :all
elsif admin.access?(current_shop, controller_gsub)
can :read, :all
end
end
end
问题是我似乎无法从Ability Class调用current_shop方法,因为我收到此错误:
undefined local variable or method `current_shop' for #<Ability:0x104df38b0>
有人知道如何解决这个问题吗? Thanx提前!
答案 0 :(得分:2)
实际上,您无法访问Ability类中的任何控制器方法。 什么是业务逻辑?如果他是current_shop的主管,管理员可以真正管理每件事吗?或者他可能只管理他管理商店的事情?
然后像smth那样很高兴:
class Ability
include CanCan::Ability
def initialize(admin)
can :manage, :all do |obj|
admin.supervise?(obj.shop) || admin.manage?(obj.shop)
end
can :read, :all do |obj|
admin.access?(obj.shop)
end
end
end
PS我不太确定该块是否适用于:all
,并且在未知类上调用.shop
并不合逻辑,但这只是为了显示方式,它很容易列出将要使用它的模型