NameError:Heroku上的未初始化常量

Sev*_*rin 4 ruby ruby-on-rails heroku ruby-on-rails-5

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

irb(main):001:0> MyClass.do_something
Run Code Online (Sandbox Code Playgroud)

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

irb(main):001:0> MyClass.do_something
NameError: uninitialized constant MyClass
Run Code Online (Sandbox Code Playgroud)

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

config.autoload_paths << Rails.root.join('lib')
Run Code Online (Sandbox Code Playgroud)

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

task do_something: :environment do
  MyClass.do_something
end
Run Code Online (Sandbox Code Playgroud)

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

有任何想法吗?

m. *_*org 9

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

config.eager_load_paths << Rails.root.join('lib')
Run Code Online (Sandbox Code Playgroud)

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

load_path_strategy = Rails.env.production? ? :eager_load_paths : :autoload_paths
config.public_send(load_path_strategy) << Rails.root.join('lib')
Run Code Online (Sandbox Code Playgroud)

如果您确实需要在生产中自动加载此目录,您可以设置enable_dependency_loadingtrue.

config.enable_dependency_loading = true
config.autoload_paths << Rails.root.join('lib')
Run Code Online (Sandbox Code Playgroud)

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

  • 非常感谢.正是我在寻找什么. (2认同)