Rails捕获所有路由,不包括资源和HTML

时间:2013-10-07 02:24:36

标签: ruby-on-rails angularjs rails-routing

我正在使用Angular html5mode,因此将Rails路由设置为将所有失败的请求重定向到root

# Angular catch all to allow page refresh
get '*page' => "home#index"

这很好用,除非Angular模块请求丢失的模板(例如/assets/templates/page.html),当它导致无限循环时

如何告诉Rails捕获所有路线,除了 / assets中的东西?

2 个答案:

答案 0 :(得分:6)

我注意到这已经很老了,但是通过谷歌找到它并且对这里唯一的答案不满意。自从我自己完成这项工作后,我将分享我的解决方案。

在路线中使用format参数

get "/*path" => "home#index", format: false

只需禁用通配符路径的格式选项,即可忽略任何格式的请求(例如css,js,png ...)


在路线中使用约束

get "/*path" => "home#index", constraints: -> (req) { !(req.fullpath =~ /^\/assets\/.*/) }

使用简单的lambda指定一个约束选项,检查你的路径值,而不是最好的正则表达式,但是显示了我要去的想法......




我个人在我的应用程序中使用format参数,约束选项也允许您传入一个对象,请查看rails指南以获取更多信息 - > http://guides.rubyonrails.org/routing.html#advanced-constraints

答案 1 :(得分:1)

路线从上到下进行评估,因此您可以执行以下操作:

# Catch all missing templates
get '/assets/templates/*page' => '/assets/templates/default.html'

# Angular catch all to allow page refresh
get '*page' => "home#index"

缺少的模板将被第一个语句捕获,所有其他缺少的路由将被第二个语句

捕获