Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 为什么不';包含在控制器名称和请求中的t名称空间_Ruby On Rails - Fatal编程技术网

Ruby on rails 为什么不';包含在控制器名称和请求中的t名称空间

Ruby on rails 为什么不';包含在控制器名称和请求中的t名称空间,ruby-on-rails,Ruby On Rails,我有一个授权方法,它截取ApplicationController上的请求,并发送给我构建的扩展用户的模块 看起来像这样 class ApplicationController < ActionController::Base def authorized?(action="#{action_name}", controller="#{controller_name.singularize}") current_user.authorize(current_user.role,

我有一个授权方法,它截取ApplicationController上的请求,并发送给我构建的扩展用户的模块

看起来像这样

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 ApplicationController
这非常有效,但今天我想在命名空间下使用一个控制器:

class Trainings::ResourcesController < ApplicationController
  before_action :authorize
  ...
end
课堂培训::ResourcesController
但当我查看请求时,控制器名称只是
resources
。我本以为它是指培训。它是第一个控制器,所以现在不是问题,但一旦我有了类似于
Clients::ResourcesController
的东西,如果它们没有相同的权限,它就会破坏我的auth模块


为什么控制器名称不在请求中包含名称空间?

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

简短回答

它不包含名称空间,因为它不应该包含名称空间

更长的答案

问题中有一个重要的错误假设:
controller\u name
未作为请求的一部分传递,它是中定义的帮助器方法

不包括名称空间,因为此方法根据传入的名称显式删除名称空间


知道这是预期的行为,最好在ApplicationController上重新编写
authorized?
方法,如praga所建议的那样使用
class

谢谢!我真的很想知道它为什么会这样,但我做了一些源头调查并发现了(见答案)。现在我知道发生了什么,这是一个很好的建议来解决它。