簡體   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