繁体   English   中英

NameError:Heroku上的未初始化常量

[英]NameError: uninitialized constant on Heroku

我有一个Rails 5应用程序,其中一些模块/类位于/lib 在开发中,我可以通过rails控制台访问它们,如下所示:

irb(main):001:0> MyClass.do_something

在Heroku的生产中我得到了这个:

irb(main):001:0> MyClass.do_something
NameError: uninitialized constant MyClass

您可能已经猜到我在application.rb中自动加载了/lib目录:

config.autoload_paths << Rails.root.join('lib')

但是,最奇怪的是,我可以从rake任务访问这个类。 所以这样的事情很好:

task do_something: :environment do
  MyClass.do_something
end

这告诉我该课程出现在Heroku上。

有任何想法吗?

Rails在生产中不会为了线程安全而自动加载,而是急切地加载应用程序常量。 您可以使用eager_load_paths方法修复问题。

config.eager_load_paths << Rails.root.join('lib')

如果您仍想在开发中自动加载,可以使其成为有条件的

load_path_strategy = Rails.env.production? ? :eager_load_paths : :autoload_paths
config.public_send(load_path_strategy) << Rails.root.join('lib')

如果您确实需要在生产中自动加载此目录,可以将enable_dependency_loading设置为true

config.enable_dependency_loading = true
config.autoload_paths << Rails.root.join('lib')

有关更多说明,请参阅此博客文章

我一直很困惑为什么我的所有对象在生产中的heroku控制台上都是未初始化的。 在我当地的制作中,他们很好。

原来问题是我正在运行:“heroku运行控制台”而不是“heroku运行rails控制台”。

值得注意的是,当您从heroku网站访问控制台时,也会出现同样的问题。 浪费了很多时间在这上面。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM