2013-07-19 84 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])