如何显示默认的Rails错误页面?

时间:2019-05-29 03:46:42

标签: ruby-on-rails ruby error-handling raise

我构建了一个错误处理程序,当生产中的任何控制器方法发生错误时,都会将用户重新路由到错误页面,并向我(开发人员)发送通知电子邮件。这行得通,但我希望在开发过程中出现正常的错误屏幕。我假设产生该代码的代码仅为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>

有人知道我如何显示默认的开发错误页面吗?

3 个答案:

答案 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。您的配置中缺少该配置,或者其他配置正在覆盖它