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

iGE*_*GEL 77 routing ruby-on-rails ruby-on-rails-3

我有一条路线供我的用户使用/iGEL/contributions,效果很好.但现在用户注册的名称为'A.and.B.',现在路由无法匹配,因为名称包含点.

我的路线:

get "/:user/contributions" => 'users#contributions'
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Zab*_*bba 136

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

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

那将是例如:

get "/:user/contributions" => 'users#contributions', :constraints => { :user => /[^\/]+/ }
Run Code Online (Sandbox Code Playgroud)

  • 谢谢.你引用的正则表达式有一个拼写错误,它应该是/ [^\/] + /,而不是/ [^\/]/+.但那是原始指南中的一个错误. (4认同)
  • 在 Rails 6 中,我[必须设置](/sf/answers/4052698681/) `format: false, defaults: {format: 'html'}` 才能让 Rails 停止尝试处理点段作为指示内容类型的文件扩展名。 (2认同)

Chr*_*bek 8

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

/([^\/]+?)(?=\.json|\.html|$|\/)/
Run Code Online (Sandbox Code Playgroud)