【问题标题】:Rails console does not autoload all directories under /appRails 控制台不会自动加载 /app 下的所有目录
【发布时间】: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


【解决方案1】:

正如 cmets 中所述,我查看了 Rails 文档,它在环境设置中引用了 eager_load。在控制台中运行时,我在development 中运行。我查看了config/environments/development,发现它不是默认加载的。

# Do not eager load code on boot.
config.eager_load = false

我只是简单地将其更改为预加载,一切正常

config.eager_load = true

【讨论】:

    【解决方案2】:

    我只是简单地将其更改为急切加载,一切正常 config.eager_load = true

    我也这样做了,它现在可以工作了,甚至再次将变量更改为 false

    【讨论】:

      【解决方案3】:

      重启弹簧。

      $ spring stop
      $ rails console
      

      这为我解决了同样的问题。

      【讨论】:

        猜你喜欢
        • 2014-05-11
        • 1970-01-01
        • 2010-09-14
        • 2014-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多