如何在Rails中将服务目录添加到加载路径?

Eki*_*bal 7 ruby ruby-on-rails

在我的Rails项目中,我想servicesapp文件夹中添加目录并包含一些服务对象.

所以我想说我想添加app/services/foo/test.rb看起来像:

module Services
  module Foo
    class Test

    end
  end
end
Run Code Online (Sandbox Code Playgroud)

我在我的config/application.rb补充说:

config.paths.add File.join('app', 'services'), glob: File.join('**', '*.rb')
config.autoload_paths += Dir[Rails.root.join('app', 'services', '*')]
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试在控制台中加载文件时,它不起作用:

?  rails c
Loading development environment (Rails 4.1.4)
[1] pry(main)> Services::Foo::Test
NameError: uninitialized constant Services
Run Code Online (Sandbox Code Playgroud)

任何帮助我该如何解决这个问题?

小智 31

添加新目录后,重新加载弹簧 spring stop


Hie*_*ham 7

首先,app文件夹下的代码将在没有任何配置的情况下加载.

我认为问题是文件夹结构与您的类定义不匹配.

所以这个配置会起作用:

应用程序/服务/富/ test.rb

module Foo
  class Test
  end
end
Run Code Online (Sandbox Code Playgroud)

我的线索是,例如我们已经app/controllers/api/v1/users_controllers.rb和类常量将是Api::V1::UsersController,而不是Controllers::Api::V1::UsersController

更新

通常,我们通常使用FooServices而不是Foo更清楚,例如:

应用程序/服务/ foo_services/bar_parser.rb

module FooServices
  class BarParser
    # Do stuff
  end
end
Run Code Online (Sandbox Code Playgroud)

所以我们理解foo_services文件夹中的每个类都是与之相关的服务Foo

  • 谢谢,有了“正确的文件路径”和“类定义”,它现在可以工作了(我正在使用Rails 5.2)。如果我只是简单地写`config.autoload_paths + = Dir [Rails.root.join('app','services')]`或`config.eager_load_paths << Rails.root.join,那是“行不通” ('app','services')`或注释掉#config.file_watcher = ActiveSupport :: EventedFileUpdateChecker`或`config.file_watcher = ActiveSupport :: FileUpdateChecker`。 (2认同)