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



当我的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,那么我从未捕获的异常中得到内部服务器错误,如果记录由于限制with_error依赖关系而无法保存。如果我从它中拯救,那么服务器将无法启动,但仅在生产环境中启动。

我猜这与渴望加载和/或zeitwerk加载常量的变化有关,但我还没有找到任何关于如何解决这个问题的答案。

我在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

最新更新