2013-07-19 85 views
3

我試圖重寫我的一個特定的控制器網址(行動),例如:Grails的動態URL重寫

www.mysite.com/user/search?sex=male&from_age=18&to_age=19 

將成爲

www.mysite.com/user/search/sex/male/from_age/18/to_age/19 

我知道我可以這樣使用Grails的做沿着以下網址重寫的網址:

"/user/search/sex/$Sex/from_age/$from_age/to_age/$to_age" { 
    controller = 'user' 
    action = 'search' 
} 

我面對的問題是用戶可以輕易地觸發url像:

www.mysite.com/user/search/sex/male/to_age/19/location/chicago 

即URL基於用戶在搜索表單

輸入的搜索標準動態反正是有動態改寫沿Apache的mod_rewrite的行的網址,以便我能有param_name/param_value而不是?param_name=param_value

+0

'from_age'在URL映射將不匹配與樣品URL中使用'to_age'字符串。用戶不會得到任何東西。 – dmahapatro

+0

是的,這是我的觀點,我需要找到一種動態創建映射的方式,以便foo/bar變成?foo = bar,而不管foo或bar是什麼 –

回答

2

您可以將通配符URL映射到你的搜索行動,但你將不得不進行參數自己的分析:

UrlMappings.groovy:

"/user/search/$query**" { 
    controller = 'user' 
    action = 'search' 
} 

這之後,給了你一切url的靜態部分作爲單個字符串。

www.mysite.com/user/search/sex/male/to_age/19/location/chicago會給你params.query = 'sex/male/to_age/19/location/chicago'

然而,這些類型的網址,不參與動態URL重寫,所以你會試圖連接它時,建立自己的URL。

快速不安全的(非轉義)轉化成paramMap查詢字符串的這種風格的例子:

def queryStr = params.collect({ n,v -> "$n/$v" }).join('/') 
g.createLinkTo(controller: 'user', action: 'search', params: [query: queryStr])