3

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

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

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

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

4

2 回答 2

7

我注意到这已经很老了,但通过谷歌找到了它,并且对这里的唯一答案不满意。由于我自己解决了这个问题,我将分享我的解决方案。

在您的路线中使用格式参数

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

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


在路由中使用约束

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

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




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

于 2014-08-14T04:17:29.340 回答
1

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

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

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

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

于 2013-10-07T03:32:35.407 回答