4

我正在寻找一种方法来列出模块(命名空间)中定义的所有类。这是关于该问题的类似问题: How to get all class names in a namespace in Ruby?

但看到最后一个回复,Module.constants在类被调用/加载之前是空的。有没有办法在不手动引用每个类的情况下做到这一点?

我正在尝试在 Rails 3.2 中使用此功能,而我发现的唯一方法是要求初始化程序中的每个类(没有尝试过,但它仍然需要手动输入......)。

在此先感谢您的时间。

4

3 回答 3

2

您可以将文件放在命名空间目录中,如下所示:

Dir.glob('/path/to/namespaced/directory/*').collect{|file_path| File.basename(file_path, '.rb').constantize}

因此,在 Rails 初始化文件或模型中,您可以执行以下操作:

Dir.glob(File.join(Rails.root, "app", "models", "my_namespace", "*")).collect{|file_path| File.basename(file_path, '.rb').constantize}
于 2012-11-20T17:42:38.727 回答
2

基于 Bryan 提供的内容,您可以使用它从特定的父命名空间获取常量/类,即使文件名/类名以某些字符串开头/结尾:

require 'pathname'

# make this the directory you are autoloading from
autoload_dir = File.join(Rails.application.root, 'app', 'models')

# this will return FooBar::BarFoo::**::*Boo constants and autoload them
Dir.glob(File.join(autoload_dir, 'foo_bar', 'bar_foo', '**', '*_boo.rb')).collect{|pathname| Pathname.new(pathname.chomp('.rb')).relative_path_from(Pathname.new(autoload_dir)).to_s.camelize.constantize}
于 2013-05-24T20:18:41.007 回答
2

Bryan Liff 简短而优雅的回答几乎是正确的,但会引发错误。相反,请尝试:

Dir.glob(File.join(Rails.root, "app", "models", "my_namespace", "*")).collect{|file_path| File.basename(file_path, '.rb').camelize.constantize}

注意使用camelize. 我会在评论中发布此内容,但没有足够的声誉这样做。

于 2017-07-14T18:39:49.530 回答