2014-05-15 48 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