#grails #url-mapping
#граали #сопоставление url
Вопрос:
У меня есть приложение, в котором пользователи могут просматривать карты двумя способами (например, миниатюры и в списке).
/map/browse
/map/list
Теперь я хотел бы ограничить эти представления простым отображением карт определенного пользователя, например, через
/user/3/browse
/user/3/list
Итак, я создал отображение:
"/user/$userId/browse" {
controller = "map"
action = "browse"
}
"/user/$userId/list" {
controller = "map"
action = "list"
}
Теперь я могу перейти на /user/3/browse
, но как только я нажимаю на ссылку разбивки на страницы или меняю фильтры разбивки на страницы, URL возвращается на /map/browse
.
Кроме того, если я устанавливаю userId
значение null
в контроллере, я получаю сообщение об ошибке:
Ошибка 500: Ошибка обработки GroovyPageView: Ошибка выполнения тега: Не удается создать URL-адрес для сопоставления [/user/(*) /list] и параметров [[«action»: «list», «controller»: «map», «max»:20, «offset»: 0, «sort»: «uploadDate», «order»: «desc», «userId»: null, «totalMaps»: 30]]. Параметр [userId] является обязательным, но не был указан! в /views/map/browse.gsp:26
Разбивка на страницы работает следующим образом:
<div class="paginateButtons">
<g:paginate controller="map" action="browse" total="${mapInstanceTotal}"></g:paginate>
</div>
Что я могу сделать против этого или каков был бы правильный способ реализации того, что я хочу?
Мне не обязательно иметь такое сопоставление URL, мне нужен только хороший способ сказать: «Отображать карты только одного пользователя».
Комментарии:
1. как вы создаете свою «ссылку для разбивки на страницы»?
Ответ №1:
Похоже, проблема не в вашей конфигурации сопоставления URL, а в вашем способе создания ссылки. Я думаю, будет лучше, если вы будете использовать сопоставление именованных URL : это понятнее, чем ваш подход сейчас, и при создании ссылки для разбивки на страницы вам нужно указать только имя URL. Например:
В UrlMappings.groovy:
static mappings = {
name accountDetails: "/details/$acctNumber" {
controller = 'product'
action = 'accountDetails'
}
}
В поле зрения — страница gsp:
<g:link mapping="accountDetails" params="[acctNumber:'8675309']">
Show Account
</g:link>
Комментарии:
1. Я ценю ваш пример, но не было бы разумнее переписать его в соответствии с моим реальным вариантом использования (например, карты и пользователи), потому что вы, вероятно, знаете, о чем говорите? 🙂
2. @slhck: Я только что нашел краткий пример. Ну, но если вы используете taglib с разбиением на страницы, то это совсем другая история, поскольку taglib пока не поддерживает сопоставление именованных URL
3. О, это плохо. Что бы вы предложили в таком случае? Могу ли я просто «перенести» параметр user ID с другими параметрами разбивки на страницы?
4. @slhck: Я часто самостоятельно создаю ссылку вместо того, чтобы использовать taglib для разбивки на страницы. Но если вы хотите использовать его, попробуйте перенести параметр «userId» в тег с помощью
params
. Пожалуйста, обратитесь к: grails.org/GSP Tag — paginate