当我的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