【发布时间】:2016-11-30 04:35:41
【问题描述】:
在我的 Rails 5 项目中,我在app 目录中添加了一个新子目录app/services,其中包含一个简单的Company 服务模块,用于查找可能随时间变化的公司信息(例如联系电话号):
- project
- app
- services
- company.rb
Company 模块在开发服务器上运行良好,并且该模块的测试都运行没有问题。这是意料之中的,因为app 的所有子目录默认都包含在autoload_paths 中。
但是,我无法从 Rails 控制台访问此模块。在控制台中,app/services 不包含在 autoload_paths 中。
从服务器运行时(两个查询结果的底部附近):
>> ActiveSupport::Dependencies.autoload_paths
=> ["project/app/assets",
"project/app/channels",
"project/app/controllers",
"project/app/controllers/concerns",
"project/app/helpers",
"project/app/jobs",
"project/app/mailers",
"project/app/models",
"project/app/models/concerns",
"project/app/services",
"project/test/mailers/previews"]
>> Rails.application.config.eager_load_paths
=> ["project/app/assets",
"project/app/channels",
"project/app/controllers",
"project/app/controllers/concerns",
"project/app/helpers",
"project/app/jobs",
"project/app/mailers",
"project/app/models",
"project/app/models/concerns",
"project/app/services"]
>> Company
=> Company
但是从控制台:
>> ActiveSupport::Dependencies.autoload_paths
=> ["project/app/assets",
"project/app/channels",
"project/app/controllers",
"project/app/controllers/concerns",
"project/app/helpers",
"project/app/jobs",
"project/app/mailers",
"project/app/models",
"project/app/models/concerns",
"project/test/mailers/previews"]
>> Rails.application.config.eager_load_paths
=> ["project/app/assets",
"project/app/channels",
"project/app/controllers",
"project/app/controllers/concerns",
"project/app/helpers",
"project/app/jobs",
"project/app/mailers",
"project/app/models",
"project/app/models/concerns"]
>> Company
=> NameError: uninitialized constant Company
(Rails.application.config.autoload_paths 在这两种情况下都是空的。)
什么给了?我似乎在任何地方都找不到这个记录。所有文档都认为app 的所有子目录总是自动加载。
提前感谢您的帮助。
编辑:Here is a duplicate question 似乎指向了正确的方向,但实际分辨率却令人无法企及。我对进入 Rails 的胆量兔子洞有点警惕,这就是这个问题导致的地方,但也许这是必要的。
【问题讨论】:
-
尝试将
config.autoload_paths += ["#{Rails.root}/app/services"]添加到您的config/application.rb文件中。 -
这很奇怪。只是作为一个健全的检查,你真的重新启动了控制台吗?
-
这是您正在寻找的文档github.com/rails/rails/blob/…
-
在尝试理解自动加载逻辑时,我清理了一些 Rails 代码 github.com/rails/rails/pull/27221
-
嘿@phoet。在尝试调试时,我确实多次重新启动控制台。您引用的 Rails Guides 文档似乎表明这不应该发生:“只要环境到位,Rails 总是能够自动加载......控制台自动加载,测试套件自动加载,当然还有应用程序自动加载。”后来:“
autoload_paths...默认情况下...包含:应用程序和引擎中的所有app子目录在启动时出现...它们不需要是默认目录,任何自定义目录,如@ 987654341@ 自动属于autoload_paths。"
标签: ruby-on-rails ruby-on-rails-5