【问题标题】:Rails default error page doesn't show on developmentRails 默认错误页面不显示在开发中
【发布时间】:2019-10-14 14:37:26
【问题描述】:

我构建了一个错误处理程序,当生产中的任何控制器方法出现错误时,它会将用户重新路由到错误页面并向我(开发人员)发送一封通知电子邮件。这可行,但我希望在开发时出现正常的错误屏幕。我认为生成此代码的代码只是 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 控制台中运行其中任何一个,它们会产生我正在寻找的错误消息,但错误页面仍然只是说“我们很抱歉,但出了点问题。”

有谁知道我怎样才能显示默认的开发错误页面?


更新

这太疯狂了……所以显示错误的代码通常应该可以正常工作,但是某处阻止了这种情况。如果我在生产中更改config.consider_all_requests_local = true,错误会出现在生产中,但是即使我将我的 config/environments/production.rb 文件复制并粘贴到我的 config/environments/development.rb 中,错误仍然不会显示在发展上。如果我进入一个 pry 控制台,request.local? 返回“0”,表示 true,Rails.env 返回“development”。我不知道发生了什么。

更新 2

显然我不应该在开发中拯救异常,但即使我删除了所有自定义错误处理代码,所以我的应用程序控制器只是空的,我的错误仍然不会在开发中显示。此外,我有一个不同的应用程序,它具有完全相同的错误处理代码,因此错误确实会显示出来。

【问题讨论】:

  • 我刚刚将您的代码粘贴到此处的一个随机应用程序上,它按预期工作!也许您的代码上还有其他问题?一些application.rbdevelopment.rb 配置?在撬动时,Rails.env 返回正确的环境?您使用的是哪个 Rails 版本?
  • @LeonardoPrado 嗯,这很奇怪,但你是对的!我删除了所有自定义错误处理代码,但错误页面仍然没有详细信息。我正在使用 Rails 6.0.0.rc1 并且 Rails.env 确实返回“开发”...
  • @JoeMorano 你明白了吗?我陷入了完全相同的境地。我在开发模式下运行,consider_all_requests_local 设置为 true,但我仍然无法在浏览器中获得完整的错误。即使在视图中 Rails.application.config.consider_all_requests_local 返回 true 而 request.local? 返回 true。
  • 几个小时后,我意识到我从 5.2 跳到了 6.1,而没有先升级到 6.0。这似乎导致了这个问题。我回滚,升级到 6.0,然后升级到 6.1,问题得到解决。可能缺少一些新的应用默认设置并导致此问题。

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


【解决方案1】:

创建如下所示的 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】:

    在您的代码中搜索consider_all_requests_local,正是这个配置显示了完整的错误日志。

    它必须在您的development.rb 配置文件中设置为true。它要么从您的配置中丢失,要么其他配置正在覆盖它

    【讨论】:

    • 我也是这么想的。我刚刚在我的整个代码库上搜索了consider_all_requests_local,只有三个实例是 development.rb,它被设置为config.consider_all_requests_local = true,production.rb,它被设置为 false,和 test.rb,它被设置为真。在 pry 控制台中,request.local? 返回“0”,表示 true,Rails.env 返回“development”。
    • 再一次,它应该工作了......春天工作了吗?你重启了吗?
    • 你可以做的另一个测试:在你的控制器上创建一个方法def local_request?; true; end,它应该强制它显示开发错误页面,看看它是否有效
    • 我试过了,但没有成功,但更奇怪的是,我在生产环境中更改了 config.consider_all_requests_local = true,并且确实出现了完整的错误。
    【解决方案3】:

    这不是“疯狂”,这是完全可以预料的行为。您不能在 rescue_from 处理程序中使用 raise。这会导致无限循环。

    您也不能rescue_from StandardError如文档中特别说明的那样:

    将 rescue_from 与 Exception 或 StandardError 一起使用会导致严重的副作用,因为它会阻止 Rails 正确处理异常。因此,除非有充分的理由,否则不建议这样做。

    您应该有条件地绑定处理程序,并选择一个更具体的异常类来处理,而不是有条件地处理 rescue_fromhandler 中的异常。

    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
    

    【讨论】:

    • 这是一个奇怪的巧合,我的代码无论如何都不应该工作,因为即使我删除了所有的 rescue_from 东西,我的应用程序也不会在开发时给出错误消息。此外,我还有另一个应用程序,它具有此问题中给出的代码(在rescue_from 中提出),并且该应用程序在开发过程中显示正常错误。
    猜你喜欢
    • 2020-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-02
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多