【问题标题】:grails controllers simple questiongrails控制器简单问题
【发布时间】:2011-05-22 22:53:01
【问题描述】:

我有这个控制器:

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”给了我所有由用户过滤的会议用户。但我还需要通过会议用户 ID 过滤的所有奖品。所以我传入了控制器 temp(代表所有用户 id = 1 的会议)并且我传递了所有赢得的奖品,以便在第二个“每个”标签中过滤它们。但这种方式行不通,因为就像我现在一样, 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:

【问题讨论】:

    标签: grails controllers


    【解决方案1】:

    好的,所以您正在循环通过会议,然后尝试为每个会议查找奖品。似乎您想要 Conference 和 Prize 域对象之间的一对多关系。如果您进行了设置,那么您在获得特定会议的奖品时不会遇到任何问题。

    一些注意事项:

    首先,永远不要通过'domainObject.find...()' 从 gsps 加载东西。这是一种非常糟糕的做法,只会给您带来麻烦。

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

    您需要了解 Grails 是一个约定驱动的框架。它基于 MVC,这是一种将视图关注点与模型关注点分开的模式,模型关注点与控制器关注点分开。如果您遵循这些约定,您将从框架中获得更多好处。

    【讨论】:

    • 非常感谢您的回答。但是,如果数据是控制器中的渲染器,我怎么能对数据进行 css 格式呢?
    • @robert 我不是说从控制器渲染数据,我说不要从 gsp 执行 findAllByConferenceUser。在控制器上按照您想要的方式设置数据,然后将其传递给 gsp。基本上 gsp 应该尽可能的愚蠢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-09
    • 2014-08-28
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多