我正在尝试在rails项目中为某些类使用带有命名空间的自定义文件夹。
基本上,我正在构建的是一项巨大的服务,所以从技术上讲,如果我需要,我可以将它移动到那里(虽然我不想这样做)。但不管怎样,我的课程都不是自动加载的。 我的文件结构是:
app/
namespace/
namespace.rb
features/
main_feature.rb # class Namespace::MainFeature
some_feature.rb # class Namespace::SomeFeature < Namespace::MainFeature
workers/
a_worker.rb
我还在我的应用程序中加载文件:
config.paths.add File.join('app', 'namespace'), glob: File.join('**', '*.rb')
config.autoload_paths += Dir[Rails.root.join('app', 'namespace', '*')]
config.autoload_paths << Rails.root.join('app/namespace/**/')
但我仍然得到NameError: uninitialized constant
实现这一目标的最佳方式是什么?
编辑:
我的问题实际上是我第二次在rails console
中调用它时才找到该类
所以
[1] pry(main)> MyNamespace::Feature
LoadError: Unable to autoload constant Feature, expected /Users/.../app/my_namespace/features/feature.rb to define it
from /.rvm/gems/ruby-2.4.1@pop2/gems/activesupport-5.1.3/lib/active_support/dependencies.rb:511:in `load_missing_constant'
[2] pry(main)> MyNamespace::Feature
=> MyNamespace::Feature
答案 0 :(得分:1)
如果您的模块结构将反映文件夹结构(不包括第一级文件夹,直接位于/app
下),您将拥有最简单的时间。
app/
namespace/
namespace.rb # class Namespace
features/
main_feature.rb # class Features::MainFeature
some_feature.rb # class Features::SomeFeature < Features::MainFeature
有了这个,您就不需要进行任何负载路径定制(这肯定会适得其反)。
因为我希望所有内容都在
中Namespace::
简单,只需添加另一个文件夹级别
app/
namespace/
namespace.rb # class Namespace
namespace/
features/
main_feature.rb # class Namespace::Features::MainFeature
some_feature.rb # class Namespace::Features::SomeFeature < Namespace::Features::MainFeature