为啥参数中带有点的路由无法匹配?

Posted

技术标签:

【中文标题】为啥参数中带有点的路由无法匹配?【英文标题】:Why do routes with a dot in a parameter fail to match?为什么参数中带有点的路由无法匹配? 【发布时间】:2011-07-19 04:27:23 【问题描述】:

我为我的用户提供了一条路线,例如/iGEL/contributions,它运行良好。但是现在一个用户注册了一个像“A.and.B.”这样的名字,现在路由无法匹配,因为名字包含点。

我的路线:

get "/:user/contributions" => 'users#contributions'

有什么想法吗?

【问题讨论】:

【参考方案1】:

查看蓝色信息框here:

默认情况下,动态段不会 接受点 - 这是因为点 用作格式化的分隔符 路线。如果您需要使用点 在动态段内添加一个 覆盖这个的约束——对于 例如:id => /[^\/]+/ 允许 除了斜线之外的任何东西。

例如:

get "/:user/contributions" => 'users#contributions', :constraints =>  :user => /[^\/]+/ 

【讨论】:

谢谢。你引用的正则表达式有一个错字的想法,它应该是/[^\/]+/,而不是/[^\/]/+。但这是原始指南中的错误。 语法例如:get "/:user/contributions" => 'users#contributions', :constraints => :id => /[^\/]+/ /.*/ 也可以,我不太了解正则表达式,无法区分。 了解更多详情@RyanGlen ?它确实适用于指定的 ruby​​ on rails 版本。 在 Rails 6 中我 had to set format: false, defaults: format: 'html' 让 Rails 停止尝试将点段视为指示内容类型的文件扩展名。【参考方案2】:

如果你的变量段是最后一个,那么使用[^\/] 正则表达式也会吃掉格式。在这种情况下,宁可使用:

/([^\/]+?)(?=\.json|\.html|$|\/)/

【讨论】:

【参考方案3】:

看起来以下链接回答了您的问题。

http://avdi.org/devblog/2010/06/18/rails-3-resource-routes-with-dots-or-how-to-make-a-ruby-developer-go-a-little-bit-insane/

【讨论】:

以上是关于为啥参数中带有点的路由无法匹配?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 中带有 URL 参数的路由

ASP.NET Web API 中带有可选参数的属性路由

ASP.NET MVC 2 中带有约束的可选路由参数?

在React Router中带参数的嵌套路由。

为啥路由存在可以视为路由不匹配(​​RoutingError)?

tp6 路由匹配参数获取问题