grails控制器简单的问题

时间:2011-05-22 22:53:02

标签: grails controllers

我有这个控制器:

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 id赢得的所有奖品。在##的地方,有我的问题。我不知道如何在控制器中执行此操作,因为'temp'为我提供了所有由User过滤的conferenceUser。但是我还需要通过conferenceUSer id过滤掉的所有奖品。所以我传入了控制器temp(代表用户id = 1的所有会议)并且我传递了所有获奖的奖品,以便在第二个'each'标签中过滤它们。但是这种方式不起作用,因为,就像我现在一样,temp.id代表多个id(如错误所示)。有什么帮助吗?如何在第一个标签中获取当时正在使用的ID?

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 个答案:

答案 0 :(得分:1)

好的,所以你通过会议循环,然后尝试为每个会议找到奖品。看起来你想在Conference和Prize域对象之间建立一对多的关系。如果你设置了它,你将不会遇到来自特定会议的奖品。

一些注意事项:

首先,永远不要从gsps通过'domainObject.find...()'加载内容。这是一种非常糟糕的做法,只会让你陷入困境。

其次,所有数据库操作都应该落后于服务。在控制器中而不是在服务中执行它并不像从gsp加载数据那么糟糕,但这不是一个好主意。拥有服务是一个好主意,因为它们将所有数据操作包装在事务中,并且它们允许您的控制器只是控制器。

您需要了解Grails是一个约定驱动的框架。它基于MVC,这是一种模式,其中View关注点与模型关注点分开,模型关注点与Controller关注点分开。如果你遵循这些惯例,你将从框架中获得更多的成果。