为什么在参数中带有点的路由不匹配?


77

我有一条适合我的用户的路线/iGEL/contributions,效果很好。但是,现在用户注册的名称类似于“ A.B.”,但由于名称中包含点,因此路由不匹配。

我的路线:

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

有任何想法吗?

Answers:


140

请在此处查看蓝色信息框:

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

例如,将是:

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

4
谢谢。您引用的正则表达式有一个错字,应该是/ [^ \ /] + /,而不是/ [^ \ /] / +。但这就是原始指南中的错误。
iGEL 2011年

语法例如是:get“ /:user / contributions” =>'users#contributions',:constraints => {:id => / [^ \ /] + /}
DavidJ 2012年

/.*/也可以,我对正则表达式不太了解,无法分辨出差异。
克里斯(Kris)'18年

有更多细节@RyanGlen吗?它确实可以在指示的红宝石上正常运行。
扎巴

1
在Rails 6中,我必须设置 format: false, defaults: {format: 'html'}为让Rails停止尝试将点段视为指示内容类型的文件扩展名。
David Moles

8

如果您的变量段是最后一个段,则使用[^\/]正则表达式也将占用格式。在这种情况下,请使用:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.