我构建了一个错误处理程序,当生产中的任何控制器方法发生错误时,都会将用户重新路由到错误页面,并向我(开发人员)发送通知电子邮件。这行得通,但我希望在开发过程中出现正常的错误屏幕。我假设产生该代码的代码仅为raise e
,但是在开发中,我现在得到的是默认的 production 错误页面(上面写着“我们很抱歉,但是有些东西错误”。),而不是以前显示的详细错误消息和跟踪。
class ApplicationController < ActionController::Base
rescue_from StandardError, with: :handle_error
#error handler
def handle_error(e)
if Rails.env.production?
#code to send email and redirect to error page
else
raise e
end
end
end
我还尝试了以下方法:
raise
raise StandardError.new e
raise e, e.message
raise e.message
并且如果我在binding.pry
控制台中运行其中任何一个,它们都会产生我正在寻找的错误消息,但是错误页面上仍然显示“我们很抱歉,但是出了点问题。” < / p>
有人知道我如何显示默认的开发错误页面吗?
答案 0 :(得分:1)
这不是“疯狂”,这是完全预期的行为。您无法在raise
处理程序中进行rescue_from
的操作。这将导致无限循环。
您还不能rescue_from StandardError
,如文档中特别说明的那样:
使用带有Exception或StandardError的rescue_from会导致严重的副作用,因为这会阻止Rails正确处理异常。因此,除非有充分的理由,否则不建议这样做。
您应该有条件地绑定处理程序,并选择一个更具体的异常类来处理,而不是在rescue_from
处理程序中有条件地处理异常。
class ApplicationController < ActionController::Base
rescue_from StandardError, with: :handle_error if Rails.env.production?
#error handler
def handle_error(e)
#code to send email and redirect to error page
end
end
答案 1 :(得分:0)
像下面一样创建ErrorsController
class ErrorsController < ApplicationController
skip_before_action :login
def not_found
respond_to do |format|
format.html { render status: 404 }
format.json { render json: { error: "Not found" }, status: 404 }
end
end
end
答案 2 :(得分:0)
在代码中搜索consider_all_requests_local
,此配置显示完整的错误日志。
必须在您的true
配置文件中将其设置为development.rb
。您的配置中缺少该配置,或者其他配置正在覆盖它