Ruby on rails 如何将服务目录添加到Rails中的加载路径?
在我的Rails项目中,我想在Ruby on rails 如何将服务目录添加到Rails中的加载路径?,ruby-on-rails,ruby,Ruby On Rails,Ruby,在我的Rails项目中,我想在app文件夹中添加services目录,并包括一些服务对象 假设我想添加app/services/foo/test.rb,如下所示: module Services module Foo class Test end end end 在我的config/application.rb中,我添加了: config.paths.add File.join('app', 'services'), glob: File.join('**', '*.
app
文件夹中添加services
目录,并包括一些服务对象
假设我想添加app/services/foo/test.rb
,如下所示:
module Services
module Foo
class Test
end
end
end
在我的config/application.rb
中,我添加了:
config.paths.add File.join('app', 'services'), glob: File.join('**', '*.rb')
config.autoload_paths += Dir[Rails.root.join('app', 'services', '*')]
但是,当我尝试在console中加载文件时,它不起作用:
⇒ rails c
Loading development environment (Rails 4.1.4)
[1] pry(main)> Services::Foo::Test
NameError: uninitialized constant Services
有什么帮助吗?我如何解决这个问题 首先,将加载
app
文件夹下的代码,而不进行任何配置
我认为问题在于文件夹结构与您的类定义不匹配
因此,此配置将起作用:
app/services/foo/test.rb
module Foo
class Test
end
end
module FooServices
class BarParser
# Do stuff
end
end
我的线索是,例如,我们有app/controllers/api/v1/users\u controllers.rb
,类常量将是api::v1::userscocontroller
,而不是controllers::api::v1::userscocontroller
更新
传统上,我们通常使用FooServices
而不是Foo
,这更清楚,例如:
app/services/foo\u services/bar\u parser.rb
module Foo
class Test
end
end
module FooServices
class BarParser
# Do stuff
end
end
所以我们知道
foo\u services
文件夹中的每个类都是与foo
相关的服务,在添加新目录后,重新加载spring
springstop
我想我的问题是因为Rails的命名约定。我刚刚将类重命名为不使用模块服务
,它成功了。您尝试重新加载rails控制台了吗?@KumarAbinash是的,我尝试了,但仍然不工作:(这是一个很好的观点,但是这并不能解决我的问题。问题是我想指定Foo
与服务相关,而不是任何Foo。想象一下,我们谈论的是像User
这样的公共类。我想说我对Service::User
感兴趣,但对User
模型不感兴趣。还有什么要做的吗那?谢谢,有了“正确的文件路径”和“类定义”,它现在可以工作了(我使用的是Rails 5.2)。如果我只写config.autoload_paths+=Dir[Rails.root.join('app','services')]
或config.eager_load_路径,它就不起作用了