在rails 2.x中捕获所有路由和404

时间:2013-02-18 18:32:33

标签: ruby ruby-on-rails-2

我有一个CorsController,只要我的应用程序收到OPTIONS请求,它就会响应跨域ajax标头(如果Origin是允许的话)。但是因为我不确切知道OPTIONS请求的确切位置,所以我在路由文件集的顶部有一条捕获路由,以捕获任何路径的任何OPTIONS请求。

map.cors '*path',
  :controller => 'cors',
  :action => 'index',
  :conditions => { :method => :options }

对于实际的OPTIONS请求,这非常有用。当应用应该提供404 Not Found时会出现此问题。

现在当我加载/no/404/for/you(我的应用程序无法处理路由的路径)时会发生什么,我不再获得404.相反,此路由被激活,我得到405 Method Not Allowed。这导致我们的日志充满错误并非真正的错误,并且监控(如New Relic)发送有关错误率的恐慌电子邮件,而实际上一切都很好。

似乎看到路径匹配,但:conditions没有,并引发异常。有趣的是,路线处理似乎是一个2遍过程。这个cors路由位于我的路由文件的顶部,只有在有OPTIONS请求(好)或者在匹配后没有其他路由声明并且该路径上没有静态文件(坏)时才会触发。 / p>

问题:

如何通过OPTIONSGET {{} {{{{} {{{}} {{}} {{{{ {1}}和POST

我很遗憾地想在Rails 2.x中做到这一点。

1 个答案:

答案 0 :(得分:2)

所以你说

  

此路径文件顶部的此cors路由仅在有OPTIONS请求(好)或匹配后没有其他路由声明时触发,并且没有静态文件路径(坏)。

您可以在routes.rb的最后添加一条与其他内容匹配的路线,然后返回404。

正如你所说的那样,它有点hacky,但我没有看到任何其他方法在顶部完成你的 catchall route 。也许有人会想出别的东西。