2014-05-15 18 views
1

我想有SEO优化的url像这样如何处理Rails资源路径中的点字符?

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

但在路径事业轨道上的点到塞满。我如何使用百分比符号形式转义点,以便它可以工作?

我的路线:

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

你试过'反斜杠\\'? – Bala

+0

@Bala你是什么意思? – lulalala

+0

我认为他的意思是'\ .' – mdesantis

回答

5

使用接受点字符的限制。

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

doc

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

+0

我的路由是使用'resources'生成的路由。这个限制还有可能吗? – lulalala

+0

是的..从文档中阅读第4节。 – emaillenin

1

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

+0

谢谢,我认为这是一个有效的参数,在这种情况下,我只能将contentType设置为'application/json'来避免这种情况。 – lulalala