除非在代码中使用,否则模块中未定义类名

时间:2011-11-24 10:37:41

标签: ruby-on-rails ruby

我在模块f.i中创建了一些类。请求(app / models / api / request.rb)

class Api::Request
end

现在我想在控制台检查该类是否存在?

>> Api.const_defined?('Request')
=> false
>> Api::Request
=> Api::Request
>> Api.const_defined?('Request')
=> true

奇怪,但是除非我在代码中使用它,否则脚本无法看到类名。 如何解决这个问题?如果你能解释这个问题,它会很棒。 该项目使用Rails 2.3

2 个答案:

答案 0 :(得分:6)

这里的问题是rails自动加载机制。基本上它的作用是对你可以在每个对象上定义的方法const_missing做出反应。调用此方法时,Rails会查找一个文件,该文件可能包含缺失常量的定义并需要它。问题是

Api::Request

触发const_missing但是

Api.const_defined?('Request')

没有。

你可以编写自己的const_defined吗?像这样(代码将进入rails初始化程序):

def Module.autoload_const_defined?(name)
  self.const_get name
ensure
  return self.const_defined?(name)
end

首先尝试自动加载常量。

答案 1 :(得分:0)

对于将来遇到这种情况的人来说,做以下事情的风格要好得多:

def Module.autoload_const_defined?(name)
  const_get(name)
rescue NameError => e
  const_defined?(name)
end
return块内的

ensure意味着发生的任何异常都会被默默地丢弃,并且有可能使调试变得非常棘手。