你如何在模块化控制器中放置过滤器?

时间:2011-03-16 08:46:01

标签: ruby-on-rails ruby-on-rails-3 controller

我在模块中有几个控制器:

class SoapTest::DashboardController < ApplicationController

class SoapTest::TestCasesController < ApplicationController

我希望能够检查用户是否对模块具有某些权限,并且由于我没有上述继承的“父”控制器,我想把检查放在应用程序的前一个过滤器中。但我似乎无法获得模块名称:

在应用程序控制器中,我有:

before_filter :check_company_features

def check_company_features
  puts controller_name
end

但是controller_name只返回“仪表板”。我需要获得“SoapTest”条款

1 个答案:

答案 0 :(得分:1)

请注意,您目前所称的modules实际上是namespaces

controller_name仅返回类名(而不是完全限定名)的原因是因为Rails显式地剥离了名称空间。您可以通过在控制器类上调用Ruby #name方法来获取它们。

class SoapTest::DashboardController < ApplicationController
  before_filter :check_company_features

  def check_company_features
    puts controller_name
    # => "dashboard_controller"
    puts self.class.name
    # => "SoapTest::DashboardController"
  end 
end

您可以在#name上调用几种字符串变形方法来获取格式化版本。

但是,我强烈建议您使用命名空间的主控制器。 而不是使用

class SoapTest::DashboardController < ApplicationController

您可以延长SoapTest::ApplicationController

class SoapTest::ApplicationController < ApplicationController
  before_filter :check_company_features

  def check_company_features
    # ...
  end
end

class SoapTest::DashboardController < SoapTest::ApplicationController
end