Rails,def或constant to symbol

时间:2015-03-22 11:58:11

标签: ruby-on-rails ruby devise constants cancan

在我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

2 个答案:

答案 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关于定义能力的内容。