为啥参数中带有点的路由无法匹配?
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/
【讨论】:
以上是关于为啥参数中带有点的路由无法匹配?的主要内容,如果未能解决你的问题,请参考以下文章