Rails获取constantize模块

时间:2013-09-02 18:05:09

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

我在模块的命名空间下有一个类,比如说

Module::Klass

我可以从控制台访问Klass,它给了我:

Module::Klass

但是,如果我尝试使用:

"klass".constantize # Calling constantize on String

它出错,因为它没有附加模块名称空间。

所以,我的问题是:有没有办法根据当前上下文来对字符串进行限制,以便我收到klass名称及其模块?

2 个答案:

答案 0 :(得分:12)

如果通过“当前上下文”表示您当前在该模块中,则可以直接访问其常量。

module Foo
  class Bar
  end

  self.const_get('Bar') # => Foo::Bar
end

如果你不在Foo之内,你当然可以这样做。

Foo.const_get('Bar') # => Foo::Bar

答案 1 :(得分:8)

不是constantize:

  

无论如何,该名称被假定为顶级常量之一   是否以“::”开头。没有词汇背景   帐户:

C = 'outside'
module M
  C = 'inside'
  C               # => 'inside'
  "C".constantize # => 'outside', same as ::C
end

但你可以使用const_get():

module MyModule
  class MyClass
    def self.greet
      puts 'hi'
    end
  end

  const_get("MyClass").greet  
end

--output:--
hi