gpt4 book ai didi

ruby-on-rails - 名称错误 : uninitialized constant on Heroku

转载 作者:数据小太阳 更新时间:2023-10-29 07:24:25 26 4
gpt4 key购买 nike

我有一个 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')

参见 this blog post以获得更多解释。

关于ruby-on-rails - 名称错误 : uninitialized constant on Heroku,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45634976/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com