Rails为什么不响应错误406?

时间:2019-10-03 10:36:31

标签: ruby-on-rails

我的控制器执行以下操作:

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

但是,如果我使用浏览器访问相应的地址,则没有得到406错误,而是得到了500错误,并且在开发过程中出现了ActionController::UnknownFormat

我可以手动得到406错误:

format.all { head :not_acceptable }

Rails不能自动这样做吗?

2 个答案:

答案 0 :(得分:0)

实际上,Rails可以正确发送HTTP 406,但出于以下两个原因,我们误认为它是500:

  • development环境中,我们得到406个 Rails错误页面,我们认为只有在异常无法得到解决时才会显示该页面
  • production环境中,该异常记录在Rollbar中,大概是在Rails重新抛出和拯救该异常以发送406之前

使用telnetopenssl s_client确认我们在这两种情况下均得到406。

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

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

答案 1 :(得分:-1)

尝试

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