自定义文件夹和命名空间

时间:2017-09-08 10:20:12

标签: ruby-on-rails ruby

我正在尝试在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

1 个答案:

答案 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