Сопоставление URL-адресов Grails вызывает ошибку в GSP

У меня есть сайт с URL-адресом, похожим на этот:

/mysite/admin/controller/action/id
/mysite/search/controller/action/id
/mysite/user/controller/action/id

У меня есть сопоставление URL-адресов, подобное этому

"/$prefix/$controller/$action?/$id?"{
    constraints {}
}

Я могу правильно добраться до контроллера.

Но на стороне ВСП

<g:link controller="controller">abc</g:link> ==> <a href="/mysite/controller/...">abc</a>

Обратите внимание, как я теряю префикс между mysite и контроллером.


person Churk    schedule 13.02.2012    source источник


Ответы (2)


Вы можете использовать сопоставления именованных URL, а затем передать prefix как часть параметры:

Сопоставления URL-адресов:

name prefix: "/$prefix/$controller/$action?/$id?"{
    constraints {}
}

ВСП:

<g:link mapping="prefix" params="[prefix:$prefix, controller:...]">abc</g:link>

Чтобы использовать sortableColumn, просто поместите все параметры URLMapping в свойство params:

<g:sortableColumn property="col" title="title" params="[ prefix: 'prefix', controller:'controller', action:'action']" />
person seth.miller    schedule 13.02.2012
comment
Это работает для ‹g:link... Отлично, но теперь я не могу заставить это работать для других тегов Linking, таких как sortableColumn или paginate. Есть ли какая-то ссылка, на которую вы можете указать мне для дальнейшего чтения? для моего sortableColumn я сделал что-то вроде этого: ‹g:sortableColumn mapping=prefix params=[prefix:prefix] и просто добавил &prefix=xxx против сопоставления его в качестве префикса URL - person Churk; 13.02.2012
comment
Мой предыдущий комментарий был неверным. Я удалил его и обновил свой ответ. - person seth.miller; 13.02.2012

Это работает, когда вы нажимаете URL-адрес в браузере, потому что префикс доступен в URL-адресе. Это не работает, когда вы используете тег ссылки для создания URL-адреса, потому что у Grails нет информации о том, какой префикс следует использовать для этого контроллера. Вам нужно будет указать значение префикса для тега ссылки.

Попробуй это

<g:link controller="controller" params="[prefix:'admin']">abc</g:link>

вкратце - вы должны передать эти динамические переменные в качестве параметров, если вы хотите, чтобы переписывание ссылок учитывало их. Прочтите дополнительные документы здесь

person Sudhir N    schedule 13.02.2012
comment
Я понимаю, что мне нужно передать params=[prefix:'admin'], что я и пытаюсь сказать. Это работает только для тегов ‹g:link, но и для других, таких как ‹g:sortableColumn или ‹g:paginate, даже если я передам параметры так, чтобы это выглядело так: ‹g:sortableColumn property=${key} title =${message} mapping=prefix params=${params} /› URL-адрес для этого преобразуется в /mysite/controller/action/id?prefix=admin, а мой префикс отсутствует в URL-адресе. - person Churk; 13.02.2012
comment
В этом случае вам придется изменить сопоставление URL-адресов, чтобы явно указать имя контроллера /admin/$controller/$action?/$id?(controller:Admin) /search/$controller/$action?/$id?(controller: Поиск) - person Sudhir N; 14.02.2012
comment
Да, я пытался это сделать, это была моя первая попытка, и она до сих пор не сохраняет префикс. - person Churk; 14.02.2012