在我application_controller.rb
我有这段代码:
def current_resource
if admin_signed_in?
:admin
elsif partner_signed_in?
:partner
end
end
现在我想将这个def
传递给这样的子控制器:
authorize_resource current_resource
然而它却给我一个错误。 undefined local variable or method
current_resource'`
如何将此current_resource
作为符号传递给其子控制器。
这就是我在控制器中调用它的方式:
class PageController < ApplicationController
authorize_resource current_resource
end
current_resource
位于application_controller
答案 0 :(得分:2)
您尝试在类上调用实例方法。你不能这样做。
如果要在没有实例的情况下调用方法,则需要在self
上声明它:
def self.current_resource
if admin_signed_in?
:admin
elsif partner_signed_in?
:partner
end
end
这仍然可能不起作用,除非该方法中使用的每个方法也声明为类级方法。
答案 1 :(得分:1)
此代码:
class PageController < ApplicationController
authorize_resource current_resource
end
将在PageController
类加载期间执行,而不是在请求处理期间执行。因此,您无法再致电admin_signed_in?
和partner_signed_in?
。另外我不知道你为什么要用参数调用authorize_resource,因为它没有参数,请检查cancancan source。
我认为你误解了cancan过滤器和能力是如何工作的。您不应将User
模型传递给过滤器。应在Ability类中检查用户类型,并根据该类型选择适当的权限。在您的控制器中(顺便说一下,它应该是PagesController
),您只需加载资源并对其进行授权,即:
class PagesController < ApplicationController
load_resource
authorize_resource
# or just load_and_authorize_resource
end
您可以自定义资源的加载和授权方式。请阅读this有关授权控制器操作和those examples的信息。另请阅读this关于定义能力的内容。