为什么控制器名称中没有包含请求的名称空间

时间:2018-04-14 12:27:53

标签: ruby-on-rails

我有一个授权方法,它拦截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具有相同的权限。

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

2 个答案:

答案 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这样的东西。