простой вопрос о контроллерах grails

#grails #controllers

#grails #контроллеры

Вопрос:

У меня есть этот контроллер:

 def participated = {

    def user = User.get(1)
    def temp = ConferenceUser.findAllByUser(user)
    def prizes = Prizes.list()

    [temp: temp, prizes: prizes]

    //redirect(action: "participated", params: params)
}
  

И это представление gsp:

 <g:each in="${temp}">

  <li>Date: ${it.dateParticipated}, <br>Role: ${it.role}, <br>Acceptence: ${it.accepted}, <br>
  <g:link controller="conference" action="participated" params="[temp: it.conference.id]">
     Conference: </g:link>${it.conference},<br>
Status: ${it.status}</li><br>

   <g:each in="${prizes.findAllByConferenceUser(temp.id)}"> ########
     PrizeName: ${it.name}
</g:each>
  <br>
</g:each>
  

Что я хочу сделать, так это то, что после печати всех объектов conferenceUser, которые мне нужны, мне нужно распечатать все выигранные призы с этим идентификатором conferenceUser. Где ##, там и моя проблема. Я не знаю, как это сделать в контроллере, потому что ‘temp’ дает мне все conferenceUser, отфильтрованные пользователем. Но мне также нужно, чтобы все выигранные призы фильтровались по идентификатору conferenceUSer. Итак, я передал в controller temp (который представляет все конференции с идентификатором пользователя = 1), и я передал все выигранные призы, чтобы отфильтровать их во втором теге ‘each’. Но этот способ не работает, потому что, как я сейчас, temp.id представляет несколько идентификаторов (как показано в ошибках). Любая помощь, пожалуйста? Как я могу получить идентификатор, который используется в данный момент в первом теге each?

 Error 500: Error evaluating expression [prizes.findAllByConferenceUser(temp.id)] on line [44]: groovy.lang.MissingMethodException: No signature of method: java.util.ArrayList.findAllByConferenceUser() is applicable for argument types: (java.util.ArrayList) values: [[50, 51, 52, 53, 54, 55, 57]]
Servlet: grails
URI: /CM/grails/conferenceUser/participated.dispatch
Exception Message: No signature of method: java.util.ArrayList.findAllByConferenceUser() is applicable for argument types: (java.util.ArrayList) values: [[50, 51, 52, 53, 54, 55, 57]]
Caused by: Error evaluating expression [prizes.findAllByConferenceUser(temp.id)] on line [44]: groovy.lang.MissingMethodException: No signature of method: java.util.ArrayList.findAllByConferenceUser() is applicable for argument types: (java.util.ArrayList) values: [[50, 51, 52, 53, 54, 55, 57]]
    Code Snippet:
  

Ответ №1:

хорошо, итак, вы просматриваете конференции, а затем пытаетесь найти приз для каждой конференции. Похоже, вам нужна связь «один ко многим» между объектами домена конференции и приза. Если вы это настроите, у вас не возникнет проблем с получением призов на данной конференции.

Несколько замечаний:

Во-первых, никогда не загружайте вещи через 'domainObject.find...()' из gsp. Это крайне плохая практика, которая только доставит вам неприятности.

Во-вторых, все операции с базой данных действительно должны выполняться службами. Делать это в контроллере, а не в службе, не так плохо, как загружать данные из gsp, но это не очень хорошая идея. Наличие сервисов — хорошая идея, потому что они оборачивают все ваши операции с данными в транзакции и позволяют вашим контроллерам быть просто контроллерами.

Вы должны понимать, что Grails — это платформа, основанная на соглашениях. Он основан на MVC, который представляет собой шаблон, в котором проблемы представления хранятся отдельно от проблем модели, которые хранятся отдельно от проблем контроллера. Если вы будете следовать этим соглашениям, вы получите больше возможностей от фреймворка.

Комментарии:

1. правильно, спасибо за ответ. Но тогда, как я могу отформатировать эти данные в css, если они обрабатываются в контроллере?

2. @robert я не говорю, что данные отображаются с контроллера, я говорю, что не выполняйте findAllByConferenceUser из gsp. Настройте данные так, как вы хотите, на контроллере, а затем передайте их в gsp. В принципе, gsp должен быть как можно более тупым.