我有一个授权方法,它拦截ApplicationController上的请求并发送到我构建的扩展User的模块。
看起来像这样
class ApplicationController < ActionController::Base
def authorized?(action="#{action_name}", controller="#{controller_name.singularize}")
current_user.authorize(current_user.role, controller, action)
end
def authorize
redirect_to unauthorized_path unless authorized?
end
end
这很好用,但今天我想在命名空间下使用控制器:
class Trainings::ResourcesController < ApplicationController
before_action :authorize
...
end
当我查看请求时,控制器名称只是resources
。我原以为它会参考训练。它是第一个控制器,所以它现在不是问题,但是只要我有像Clients::ResourcesController
这样的东西,它就会打破我的身份验证模块,如果他们不这样做的话。 t具有相同的权限。
为什么控制器名称不包含请求中的命名空间?
答案 0 :(得分:0)
self.class.to_s有效!它为您提供名称空间。请参阅下面的日志
def authorized?(action="#{action_name}", controller="#{controller_name.singularize}")
puts "action:#{action_name}--controller:#{self.class.to_s}"
current_user.authorize(current_user.role, controller, action)
end
def authorize
redirect_to unauthorized_path unless authorized?
end
Started GET "/clients/resources" for 0:0:0:0:0:0:0:1 at 2018-04-14 18:29:34 +0530
Processing by Clients::ResourcesController#index as HTML
action:index--controller:Clients::ResourcesController
Started GET "/trainings/resources" for 0:0:0:0:0:0:0:1 at 2018-04-14 18:33:52 +0530
Processing by Trainings::ResourcesController#index as HTML
action:index--controller:Trainings::ResourcesController
答案 1 :(得分:0)
简短回答:
它没有包含名称空间,因为它不应该。
更长的答案:
问题中有一个重要的错误假设:controller_name
未作为请求的一部分传递,它是ActionController中定义的辅助方法。
不包含名称空间,因为此方法在传入的名称上按calling demodulize
显式删除名称空间。
知道这是预期的行为,最好在ApplicationController上重写authorized?
方法,以便像praga建议的那样使用像class
这样的东西。