检查ruby类是否在特定模块中

问题描述 投票:1回答:3

我有一个带有controllercontroller.class == Admin::TeamsController对象。我可能也遇到类似controller.class == Admin::UsersController的情况。现在我要检查这是否正确:

controller.class.to_s.match?('Admin::')

即,我想知道:这个对象是Admin模块名称空间中定义的类的对象吗?要说明这一点,结构是否如下所示?

module Admin
  module SomeOtherModulePerhaps
    class TeamsController
    end
  end
end

我的问题:有没有更好的Ruby方法来对此进行测试?将类转换为字符串,然后像这样进行正则表达式匹配,感觉有点不客气。

编辑:

对于我受限的用例,我可以这样检查:

controller.class.to_s.split('::').first == 'Admin'

但是那并不能完全解决其他人可能遇到的一般情况。例如,可能出现某些情况,例如XyzAdmin::TeamsController可能要排除的情况,而我的第一个解决方案失败;或者Foo::Admin::TeamsController可能要排除[[include,而我的第二个解决方案失败。

我想找到一种更好的方法。
ruby-on-rails ruby
3个回答
0
投票

0
投票
怎么样

controller.class.const_defined?(:Admin)

返回真或假

0
投票
[您可能会尝试使用Module#nesting,但它会返回相当意外的结果,具体取决于是否使用完全限定的名称

或一组嵌套语句来定义该类。

毕竟,类名称是ruby

are

简单常量,并且可能会以多种方式定义类名称,例如:Module#nesting
粗略地讲,有很多方法可以欺骗最佳检测机制。也就是说,我会选择最简单的一种。

module A def self.class! Class.new do |c| define_method :test do puts c.name end end end end A.const_set :C, A.class! #⇒ A::C A::C.new.test #⇒ A::C

除了controller.class.to_s.split('::')[0...-1].include?('Admin')
是类名称链中的

last

项之外,都将计算Admin的任何出现。
© www.soinside.com 2019 - 2024. All rights reserved.