2017-08-11 103 views
2

我有一个Rails 5应用程序,其中一些模块/类位于/lib下。在发展中,我可以访问那些通过轨道控制台,像这样:NameError:Heroku上未初始化的常量

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

生产中在Heroku我得到这个:

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

正如你可能已经猜到了我自动载入/lib目录在我的application.rb中:

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

然而,最令人好奇的是,我可以从rake任务中访问这个类。所以像这样的工作很好:

task do_something: :environment do 
    MyClass.do_something 
end 

这告诉我,这个类是存在于Heroku。

任何想法?

+0

'MyClass'运行 - 但在您的rails应用程序之外... – Liroy

+0

@LiroyLeshed好吧,但这并不能解释它为什么在开发控制台中运行,但不在Heroku控制台中运行... – Severin

+0

如果您运行' rails c production'在本地,并尝试打电话给你的班级? – nattfodd

回答

5

为了线程安全,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_loadingtrue

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

有关更多说明,请参阅this blog post

+2

非常感谢。正是我在找什么。 – Severin

相关问题