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 method
current_resource'`
我如何将这个 current_resource
作为符号传递给它的子控制器。
这就是我在控制器中的称呼:
class PageController < ApplicationController
authorize_resource current_resource
end
current_resource
在application_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 关于定义能力的内容。
在我的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
您试图在 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 关于定义能力的内容。