1

我在我正在构建的应用程序中使用 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

问题是我似乎无法从能力类调用 current_shop 方法,因为我收到此错误:

undefined local variable or method `current_shop' for #<Ability:0x104df38b0>

有人知道该怎么做吗?提前谢谢!

4

1 回答 1

2

实际上,您无法将任何控制器方法访问到 Ability 类中。什么是业务逻辑?如果管理员是 current_shop 的主管,他真的可以管理每一件事吗?或者他可能只能管理他管理商店的东西?

那么有这样的东西会很好:

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,但这只是为了说明问题,列出将使用它的模型很容易

于 2012-06-05T13:27:29.327 回答