我有这个控制器:
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:
答案 0 :(得分:1)
一些注意事项:
首先,永远不要从gsps通过'domainObject.find...()'
加载内容。这是一种非常糟糕的做法,只会让你陷入困境。
其次,所有数据库操作都应该落后于服务。在控制器中而不是在服务中执行它并不像从gsp加载数据那么糟糕,但这不是一个好主意。拥有服务是一个好主意,因为它们将所有数据操作包装在事务中,并且它们允许您的控制器只是控制器。
您需要了解Grails是一个约定驱动的框架。它基于MVC,这是一种模式,其中View关注点与模型关注点分开,模型关注点与Controller关注点分开。如果你遵循这些惯例,你将从框架中获得更多的成果。