我想拥有像这样的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"
答案 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.de和http://example.com/sites/1-blau.de.json,则第二个不会被rails作为format:json处理。 :site_name将是整个1-blau.de.json。将点编码为%2E的Uri由不同浏览器以不同方式处理(Chrome将%2E解析为'。'而Firefox将将其保持为%2E)。