如何在下面的过滤器中找到命名空间或模块“Foo”的名称?

class ApplicationController < ActionController::Base
  def get_module_name
    @module_name = ???
  end
end


class Foo::BarController < ApplicationController
  before_filter :get_module_name
end
有帮助吗?

解决方案

这些解决方案都没有考虑具有多个父模块的常量。例如:

A::B::C

从Rails 3.2.x开始,你可以简单地说:

"A::B::C".deconstantize #=> "A::B"

从Rails 3.1.x开始,您可以:

constant_name = "A::B::C"
constant_name.gsub( "::#{constant_name.demodulize}", '' )

这是因为#demodulize与#deststantize相反:

"A::B::C".demodulize #=> "C"

如果您确实需要手动执行此操作,请尝试以下操作:

constant_name = "A::B::C"
constant_name.split( '::' )[0,constant_name.split( '::' ).length-1]

其他提示

这应该这样做:

  def get_module_name
    @module_name = self.class.to_s.split("::").first
  end

对于简单的情况,您可以使用:

self.class.parent

如果控制器确实有模块名称,这将有效,但如果没有,则会返回控制器名称。

class ApplicationController < ActionController::Base
  def get_module_name
    @module_name = self.class.name.split("::").first
  end
end

但是,如果我们将其改为:

class ApplicatioNController < ActionController::Base
  def get_module_name
    my_class_name = self.class.name
    if my_class_name.index("::").nil? then
      @module_name = nil
    else
      @module_name = my_class_name.split("::").first
    end
  end
end

您可以确定该类是否具有模块名称,并返回除您可以测试的类名以外的其他内容。

我知道这是一个旧线程,但我只是想要根据控制器的命名空间进行单独导航。我想出的解决方案就是我的应用程序布局:

<%= render "#{controller.class.name[/^(\w*)::\w*$/, 1].try(:downcase)}/nav" %>

这看起来有点复杂,但基本上做了以下 - 它采用控制器类名称,例如“People”。对于非命名空间的控制器,以及“Admin :: Users”;对于命名空间的。将[]字符串方法与在两个冒号之前返回任何内容的正则表达式一起使用,如果没有,则返回nil。然后它将其更改为小写(如果没有命名空间并且返回nil,则“try”存在)。这使我们得到命名空间或nil。然后它只是使用或不使用命名空间呈现部分,例如没有命名空间:

app/views/_nav.html.erb

或在admin命名空间中:

app/views/admin/_nav.html.erb

当然,每个命名空间必须存在这些部分,否则会发生错误。现在,每个控制器的导航都将显示在每个控制器上,而无需更改任何控制器或视图。

<代码> my_class.name.underscore.split( '/')。片(0 ..- 2)

<代码> my_class.name.split( '::')。片(0 ..- 2)

我认为没有更清洁的方式,而且我已经在其他地方看到了这个

class ApplicationController < ActionController::Base
  def get_module_name
    @module_name = self.class.name.split("::").first
  end
end

我建议 gsub 而不是 split 。鉴于您不需要任何其他模块名称, split 更有效。

class ApplicationController < ActionController::Base
  def get_module_name
    @module_name = self.class.to_s.gsub(/::.*/, '')
  end
end

有许多子模块:

module ApplicationHelper
  def namespace
    controller.class.name.gsub(/(::)?\w+Controller$/, '')
  end
end

示例: Foo :: Bar :: BazController =&gt; <代码>富::酒吧

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top