Grails «теряет» пользовательское сопоставление URL-адресов при переходе по любым ссылкам на странице

#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