ruby-on-rails - 从 Rails 4 升级到 Rails 5 后,自定义错误处理不再起作用
问题描述
我们使用config.exceptions_app
将异常路由到客户错误控制器(在此处描述)。这在我们的 Rails 4 应用程序中运行良好,但自从我们升级到 Rails 5 后,此设置不再有效,并且我们在处理函数中收到错误“未定义的局部变量或方法 `env'”。
应用程序.rb
module MyApp
class Application < Rails::Application
# Route errors to our custom error controller
# (See https://coderwall.com/p/w3ghqq)
config.exceptions_app = lambda do |env|
ExceptionsController.action(:render_error).call(env)
end
end
end
exceptions_controller.rb
class ExceptionsController < BaseController
def render_error
@exception = env["action_dispatch.exception"] # RAILS 5 RAISES ERROR HERE: "undefined local variable or method `env'"
exception_wrapper = ActionDispatch::ExceptionWrapper.new(request.env, @exception)
@status_code = exception_wrapper.status_code
trace = exception_wrapper.application_trace
# Custom notifications and stuff...
end
end
解决方案
感谢@zakariah1 的帮助(如果您想发布答案,我会给您信任)。
事实证明,我必须对 render_error 函数进行一些更改才能使一切正常。我在下面发布了 Rails 4 和 Rails 5 版本供参考:
def render_error
# --- FOR RAILS 4: ---
## @exception = env["action_dispatch.exception"]
## exception_wrapper = ActionDispatch::ExceptionWrapper.new(env, @exception)
# --- FOR RAILS 5: ---
@exception = request.env["action_dispatch.exception"]
exception_wrapper = ActionDispatch::ExceptionWrapper.new(request.env['action_dispatch.backtrace_cleaner'], @exception)
trace = exception_wrapper.application_trace
# Custom notifications and stuff...
end
推荐阅读
- c++ - C++ CDB 调试器问题
- php - Foreach 上升 1 php
- c# - 为什么我的对象在 transform.Translate 上没有停止移动?
- swift - 如何消除“变量未使用”警告并保持强引用?
- python - 如何在查询中向 SQLAlchemy 中已定义的关系添加约束或谓词?
- mongodb - 如何使用 go 和 mongodb 在 heroku 上部署应用程序而不会出错?
- javascript - 从外部 Windows 应用程序拖放到 IE HTML 页面 - 如何进行复制,而不是移动
- c++ - 使用自动时没有数组边界检查
- python - 如何在healpy中旋转整个healpix贴图?
- html - Vue.js 有条件的 if else