如何处理Rails资源路由中的点字符?

时间:2014-05-15 08:21:04

标签: ruby-on-rails ruby ruby-on-rails-3

我想拥有像这样的SEO优化网址

http://example.com/sites/1-blau.de/plans

但路径中的点会导致Rails陷入困境。如何将点转换为百分比表示形式,以便它可以工作?

我的路线:

resources :sites, only: [] do
  resources :plans, only: [:index, :show] do
  end
end

我尝试过URI.escape和CGI.escape,但都没有。

URI.escape('a.b')=> "a.b"
CGI.escape('a.b')=> "a.b"

我以为我想要什么

Foo.escape('a.b')=> "a%2Eb"

2 个答案:

答案 0 :(得分:6)

使用接受点字符的约束。

get 'sites/:site_name/plans', constraints: { site_name: /[a-zA-Z0-9\.]+/ }

来自doc

  

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

答案 1 :(得分:1)

请注意,接受的答案(添加允许点的约束)不幸会破坏您的格式。例如,如果要同时支持http://example.com/sites/1-blau.dehttp://example.com/sites/1-blau.de.json,则第二个不会被rails作为format:json处理。 :site_name将是整个1-blau.de.json。将点编码为%2E的Uri由不同浏览器以不同方式处理(Chrome将%2E解析为'。'而Firefox将将其保持为%2E)。