Rails, def 或 constant to symbol

Rails, def or constant to symbol

在我的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 methodcurrent_resource'`

我如何将这个 current_resource 作为符号传递给它的子控制器。

这就是我在控制器中的称呼:

class PageController < ApplicationController
     authorize_resource current_resource
end

current_resourceapplication_controller

里面

您试图在 class 上调用实例方法。你不能这样做。

如果你想在没有实例的情况下调用方法,你需要在self上声明它:

def self.current_resource
   if admin_signed_in?
     :admin
   elsif partner_signed_in?
     :partner
   end
end

仍然可能无法工作,除非该方法中使用的每个方法都声明为class级方法。

此代码:

class PageController < ApplicationController
 authorize_resource current_resource
end

将在 PageController class 加载期间执行,而不是在请求处理期间执行。所以你不能再调用 admin_signed_in?partner_signed_in? 了。另外我不知道你为什么要用参数调用 authorize_resource,因为它没有参数,检查 cancancan source.

我认为您误解了康康过滤器和能力的工作原理。您不应将 User 模型传递给过滤器。应在 Ability class 中检查用户类型,并根据此选择适当的权限。在你的控制器中(顺便说一句,它应该是 PagesController)你只加载资源并授权它们,即:

class PagesController < ApplicationController
  load_resource
  authorize_resource
  # or just load_and_authorize_resource
end

您可以自定义资源的加载和授权方式。请阅读 this about authorizing controller actions and those examples. And also please read this 关于定义能力的内容。