在Rails 8中列出所有派生类
我想在Rails中列出某个特定类的所有子孙类(如果需要的话,ApplicationComponent): 启用预加载时,这很容易
ApplicationComponent.descendants
但开发环境通常没有启用预加载,在这种情况下,这将返回 []。由于进行自动加载需要一段时间(在 Zeitwerk::Loader.eager_load_all 的情况下),我希望能用 #eager_load_namespace 只加载我需要的那些:
loader = Zeitwerk::Loader.new
loader.push_dir('app/components')
loader.setup
loader.eager_load_namespace(ApplicationComponent)
但随后 .descendents 会给我 []。
同样地,
Zeitwerk::Loader.eager_load_namespace(ApplicationComponent)
我是不是漏掉了什么?
解决方案
这似乎是一个概念性的问题,已经有一个加载器在管理我关心的目录,Rails.autoloaders.main,需要被指示进行预加载。经过实验我发现,向 config/application.rb 添加以下内容
config.to_prepare do
Rails
.autoloaders
.main
.eager_load_dir(Rails.root.join('app/components'))
end
可以确保 ApplicationComponent.descendants 在所有环境中返回完整的子类列表,同时对启动时间没有明显影响。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。