如何在下面的过滤器中找到命名空间或模块"Foo"的名称?
class ApplicationController < ActionController::Base def get_module_name @module_name = ??? end end class Foo::BarController < ApplicationController before_filter :get_module_name end
Jason Harrel.. 98
这些解决方案都没有考虑具有多个父模块的常量.例如:
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与#deconstantize相反:
"A::B::C".demodulize #=> "C"
如果您确实需要手动执行此操作,请尝试以下操作:
constant_name = "A::B::C" constant_name.split( '::' )[0,constant_name.split( '::' ).length-1]
Hettomei.. 24
对于简单的情况,您可以使用:
self.class.parent
Daniel Lucra.. 22
这应该这样做:
def get_module_name @module_name = self.class.to_s.split("::").first end
或者你也可以使用**self.class.name.demodulize**来达到这个目的. (11认同)
不,你不能,实际上demodulize确实返回没有命名空间的类名 (3认同)
正如Jason Harrelson指出的那样,这并未考虑多个父模块. (2认同)
Steropes.. 6
如果控制器确实有模块名称,这将有效,但如果没有,则返回控制器名称.
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
您可以确定该类是否具有模块名称,并返回除您可以测试的类名以外的其他内容.
这些解决方案都没有考虑具有多个父模块的常量.例如:
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与#deconstantize相反:
"A::B::C".demodulize #=> "C"
如果您确实需要手动执行此操作,请尝试以下操作:
constant_name = "A::B::C" constant_name.split( '::' )[0,constant_name.split( '::' ).length-1]
对于简单的情况,您可以使用:
self.class.parent
这应该这样做:
def get_module_name @module_name = self.class.to_s.split("::").first end
如果控制器确实有模块名称,这将有效,但如果没有,则返回控制器名称.
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
您可以确定该类是否具有模块名称,并返回除您可以测试的类名以外的其他内容.