首页 > 解决方案 > 为什么 Rails 没有响应错误 406?

问题描述

我的控制器具有以下操作:

def foo
  respond_to do |format|
    format.csv { "foo,bar,baz" }
  end
end

但是如果我用浏览器访问相应的地址,而不是得到一个 406 错误,我得到一个 500 错误,并且在开发中,ActionController::UnknownFormat.

我可以手动得到 406 错误:

format.all { head :not_acceptable }

Rails 不应该自动执行此操作吗?

标签: ruby-on-rails

解决方案


所以实际上,Rails 正确地发送了 HTTP 406,但我们将其误认为是 500,原因有两个:

  • development环境中,我们得到一个 406Rails 错误页面,我们认为只有在异常未获救时才会显示
  • production环境中,异常被记录在 Rollbar 中,大概是在被 Rails 重新抛出并救出发送 406 之前

不过,使用telnetopenssl s_client确认我们在这两种情况下都会得到 406。

在我们的案例中,解决方案是ActionController::UnknownFormat在 Rollbar 配置中忽略:

config.exception_level_filters.merge!({
  'ActionController::UnknownFormat' => 'ignore'
})

推荐阅读