2011-05-22 99 views
0

我有這樣的控制器: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對象後,我需要打印以該會議用戶ID贏得的所有獎品。 ##在哪裏,是我的問題。我不知道如何在控制器中做到這一點,因爲'臨時'給了我所有由用戶過濾的會議用戶。但我也需要贏得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

好的,您正在循環會議,然後嘗試爲每個會議進行獎勵查找。看起來好像你想在會議和獎域對象之間建立一對多的關係。如果你確定了這一點,你將不會遇到任何麻煩。

的幾個注意事項:

首先,從來沒有通過'domainObject.find...()'從GSPS加載的東西。這是一個非常糟糕的做法,只會讓你陷入困境。

其次,所有數據庫操作應該真的落後於服務。在控制器中而不是在服務中執行它並不像從gsp加載數據那麼糟糕,但它不是一個好主意。擁有服務是一個好主意,因爲它們將所有數據操作都包含在事務中,並且它們允許您的控制器只是控制器。

您需要了解Grails是一個以約定爲導向的框架。它基於MVC,這是一種模式,View觀點與Model關注點保持分開,而Model模型關注點與Controller關注點保持分離。如果你遵循這些慣例,你會從框架中獲得更多的空白。

+0

對此感謝答案。但是,那麼,如果它是控制器中的渲染器,我該如何格式化該數據? – robert 2011-05-22 23:06:01

+0

@robert即時通訊不是說從控制器呈現數據,即時通訊說不要從一個gsp做findAllByConferenceUser。按照您希望的方式在控制器上設置數據,然後將其傳遞給gsp。基本上gsp應該儘可能愚蠢。 – hvgotcodes 2011-05-22 23:09:53

+0

好的。謝謝你的幫助。 – robert 2011-05-22 23:16:56