我正在寻找一种方法来列出模块(命名空间)中定义的所有类。这是关于该问题的类似问题: How to get all class names in a namespace in Ruby?
但看到最后一个回复,Module.constants
在类被调用/加载之前是空的。有没有办法在不手动引用每个类的情况下做到这一点?
我正在尝试在 Rails 3.2 中使用此功能,而我发现的唯一方法是要求初始化程序中的每个类(没有尝试过,但它仍然需要手动输入......)。
在此先感谢您的时间。
我正在寻找一种方法来列出模块(命名空间)中定义的所有类。这是关于该问题的类似问题: How to get all class names in a namespace in Ruby?
但看到最后一个回复,Module.constants
在类被调用/加载之前是空的。有没有办法在不手动引用每个类的情况下做到这一点?
我正在尝试在 Rails 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}
基于 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}
Bryan Liff 简短而优雅的回答几乎是正确的,但会引发错误。相反,请尝试:
Dir.glob(File.join(Rails.root, "app", "models", "my_namespace", "*")).collect{|file_path| File.basename(file_path, '.rb').camelize.constantize}
注意使用camelize
. 我会在评论中发布此内容,但没有足够的声誉这样做。