未初始化的常量 ActiveRecord::DeleteRestrictionError 仅在部署到 Heroku 时

Posted

技术标签:

【中文标题】未初始化的常量 ActiveRecord::DeleteRestrictionError 仅在部署到 Heroku 时【英文标题】:uninitialized constant ActiveRecord::DeleteRestrictionError only when deployed to Heroku 【发布时间】:2021-12-06 19:29:58 【问题描述】:

当我的 Rails 应用程序在 Heroku 上加载时,我收到一个未初始化的常量错误,但它在开发中运行良好。

Heroku 日志(启动时中断):

/app/app/controllers/application_controller.rb:19:in `<class:ApplicationController>': uninitialized constant ActiveRecord::DeleteRestrictionError (NameError)

controllers/application_controller.rb中的相关行:

class ApplicationController < ActionController::API
  # ...
  # Line 19
  rescue_from ActiveRecord::DeleteRestrictionError, with: :not_processable
  # ...
end

如果我注释掉rescue_from,那么如果记录由于restrict_with_error 依赖关系而无法保存,我会从未捕获的异常中得到内部服务器错误。如果我确实从中进行了救援,那么服务器将无法启动,但只能在生产环境中。

我猜这与急切加载和/或 zeitwerk 加载常量的方式的变化有关,但我无法找到任何有关如何解决此问题的答案。

【问题讨论】:

【参考方案1】:

我从 2008 年发现了一个类似的问题/解决方案:

https://discuss.rubyonrails.org/t/rescue-from-issue-with-aws-uninitialized-constant/28759/2

他们的解决方案是将常量包装在一个字符串中,以避免加载时出现文件解析时间问题,这似乎也适用于这种情况:

class ApplicationController < ActionController::API
  # ...
  rescue_from "ActiveRecord::DeleteRestrictionError", with: :not_processable
  # ...
end

这个问题是用一个最小的应用程序复制的,并且在 Github 上打开了一个问题:https://github.com/rails/rails/issues/43666

【讨论】:

以上是关于未初始化的常量 ActiveRecord::DeleteRestrictionError 仅在部署到 Heroku 时的主要内容,如果未能解决你的问题,请参考以下文章

未初始化的常量 Logger (NameError)

rails 链接表“未初始化的常量”错误

HomePresenter 的未初始化常量

Rails:NameError:未初始化的常量

未初始化的常量 Twitter (NameError)

NameError 未初始化常量 Model::Object