2013-07-19 2 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' URL переписывания вдоль линий:

"/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 является динамическим на основе критериев поиска, введенных пользователем в форме поиска

Есть в любом случае динамической перезаписи URL, по линиям апача mod_rewrite, так что я мог бы param_name/param_value вместо ?param_name=param_value?

+0

'from_age' в отображении URL-адрес не совпадает с' to_age' строки, используемой в образце URL. Пользователь ничего не получит. – 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'

Однако такого рода URLs не участвует в динамической перезаписи URL, поэтому вам придется строить URL, сам при попытке связать с ним.

быстро небезопасный (неэкранированный) пример трансформации paramMap в том, что стиль строки запроса:

def queryStr = params.collect({ n,v -> "$n/$v" }).join('/') 
g.createLinkTo(controller: 'user', action: 'search', params: [query: queryStr]) 
Смежные вопросы