Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何将服务目录添加到Rails中的加载路径?_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on 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('**', '*.

在我的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('**', '*.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_路径,它就不起作用了