首页 > 解决方案 > 无法为我不使用的格式拯救 ActionController::UnknownFormat

问题描述

我加入了许多想要拯救ActionController::UnknownFormat他们的 Rails 应用程序但无能为力的人的行列。

我更愿意拯救我不关心的异常,既可以为被误导的使用提供更好的错误页面,也可以让我的异常跟踪器保持安静。

我试图解决的两种情况是:

  1. 像这样的 URL /catalog.xml(我只响应 HTML 请求)
  2. 具有限制格式的请求,例如:变体。request.formats: ["application/json", "text/javascript", "application/xml"] (通常是机器人)

我所做的研究表明这个解决方案是最好的方法,但不幸的是,它对我不起作用。

app/controllers/application_controller.rb,我有这个:

rescue_from ActiveRecord::RecordNotFound,               :with => :render_standard_error
rescue_from ActionController::UnknownFormat,            :with => :render_standard_error
rescue_from ActionController::InvalidAuthenticityToken, :with => :render_token_error

这很好用,除了ActionController::UnknownFormat.

render_standard_error方法只是设置一些环境默认值并呈现错误页面。

我预计这rescue_from ActionController::UnknownFormat会像它对其他错误类型的工作方式一样工作,但没有捕获到异常。

我敢肯定我在这里遗漏了一些非常明显的东西,但如果我能弄清楚的话,该死的。

我将 Rails 5.2.2 与乘客 5.3.1 一起使用。

更新:

我实际上看到了两种不同的行为:

  1. 当我去 时/catalog.xml,我得到:
ActionController::UnknownFormat at /catalog.xml
ProductsController#index is missing a template for this request format and variant.

request.formats: ["application/xml"]
request.variant: []
  1. 但是如果我尝试/catalog.invalid,目录页面会正常加载,就好像我只使用了/catalog.

标签: ruby-on-rails

解决方案


我无法复制您的问题。这是我尝试过的:

  1. 启动了一个新的 Rails 应用程序。
  2. 我创建了一个 Person 脚手架(名称作为唯一的列)。然后我运行了迁移。
  3. 然后我将以下内容粘贴到我的应用程序控制器中:

Stack Overflow 无法正确格式化,所以我将其粘贴在这里: https ://gist.github.com/BKSpureon/391b0da243b32936334d7989f3e3cadb

似乎引发并捕获异常就好了?!请发布更多信息:您希望在哪里引发错误。

脚步

  • 你能手动抛出和捕获异常吗?
  • Rails 可能会做一些有趣的事情:如果您要求的格式不存在,rails 可能会触发另一个异常。您是否能够在您期望跌倒的控制器中添加一个 byebug 语句,然后一直观察它?

推荐阅读