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

Ruby on rails Rails捕获所有路由,不包括资源和HTML,ruby-on-rails,angularjs,rails-routing,Ruby On Rails,Angularjs,Rails Routing,我使用的是角度HTML5模式,所以将Rails路由设置为将所有失败的请求重定向到root # Angular catch all to allow page refresh get '*page' => "home#index" 这很好,除了当Angular模块请求缺少的模板(例如/assets/templates/page.html)时,它会导致无休止的循环 如何告诉Rails捕获所有路由,除了/assets中的东西?路由是自上而下评估的,因此您可以执行以下操作: # Catch al

我使用的是角度HTML5模式,所以将Rails路由设置为将所有失败的请求重定向到root

# Angular catch all to allow page refresh
get '*page' => "home#index"
这很好,除了当Angular模块请求缺少的模板(例如/assets/templates/page.html)时,它会导致无休止的循环


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

路由是自上而下评估的,因此您可以执行以下操作:

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

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

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

我注意到这条语句很旧,但通过谷歌找到了它,对这里的唯一答案不满意。因为我自己解决了这个问题,所以我将分享我的解决方案。

在路线中使用格式参数

get "/*path" => "home#index", format: false
只需禁用通配符路径的format选项,即可忽略任何格式的请求(例如css、js、png…)


在路线中使用约束

get "/*path" => "home#index", constraints: -> (req) { !(req.fullpath =~ /^\/assets\/.*/) }
指定一个约束选项,用一个简单的lambda检查您的路径值,这不是最好的正则表达式,但显示了我在这里要表达的想法




就我个人而言,我在我的应用程序中使用format参数,constraints选项还允许您传入一个对象,有关更多信息,请查看rails指南->