Перезапись динамического URL-адреса 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

Я знаю, что мог бы сделать это, переписав URL-адрес 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-адрес является динамическим на основе критериев поиска, введенных пользователем в форме поиска.

Можно ли динамически переписывать URL-адреса по строкам Apache mod_rewrite, чтобы я мог иметь param_name/param_value вместо ?param_name=param_value?


person Community    schedule 19.07.2013    source источник
comment
from_age в сопоставлении URL-адреса не будет совпадать со строкой to_age, используемой в образце URL-адреса. Пользователь ничего не получит.   -  person dmahapatro    schedule 19.07.2013
comment
Да, это моя точка зрения, мне нужно найти способ динамического создания сопоставления, чтобы foo/bar становился ?foo=bar независимо от того, что такое foo или bar   -  person    schedule 20.07.2013


Ответы (1)


Вы можете сопоставить 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-адресов, поэтому вам придется создавать URL-адреса самостоятельно при попытке ссылки на них.

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

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