如何在引发exception时保留响应头?

我正在使用rack-cors在我们的API请求中添加CORS响应头。

当请求成功时它工作正常(200)。 但是当应用程序通过authenticate_user!引发exceptionActiveRecord::RecordNotFound (404)或设计 /无效凭据时authenticate_user! (401) – 它没有响应CORS响应头。

它不仅适用于机架式。 它不响应在引发exception之前添加的任何自定义标头。

最大的问题是在客户端(浏览器),因为它不是根据状态代码显示正确的错误,而是显示:

XMLHttpRequest无法加载http://development.com:4000/orders/1 。 请求的资源上不存在“Access-Control-Allow-Origin”标头。 因此,不允许来源“ http://development.com:3000 ”访问。

如果我手动捕获exceptionrescue_fromrender json: {}, status: 500它会响应标题。

我长期与这个问题作斗争,答案是:

您设置Rack :: Cors中间件的顺序很重要。 像这样用它:

 config.middleware.insert_after Rails::Rack::Logger, Rack::Cors, :logger => Rails.logger do allow do origins '*' resource '*', headers: :any, methods: %i[get post patch put delete options] end end 

更多信息: https : //github.com/cyu/rack-cors/issues/33