2013-03-20 104 views
0

試圖成爲一個Grails轉換器我已經開始將現有的應用程序轉換爲Grails和Groovy。它工作得很好,但我卡在選擇標籤的轉換。grails填充g:從查詢中選擇

我有一個域類:

package todo 

    class Person { 

    String ssn 
    String firstname 
    String familyname 
    String role 
    String emailname 
    String emailserver 
    ... 

當創建一個新的「待辦事項」任務的所有者可以從系統中誰是開發商的人士進行分配,我得到這個工作(相當直接翻譯自PHP):

<select id="owner" name="owner"> 
    <option>Noboby ...</option> 
    <g:each in="${Person.list()}"> 
    <g:if test="${it?.role=='developer'}"> 
     <option value="${it?.id}">${it?.firstname} ${it?.familyname}</option> 
    </g:if> 
    </g:each> 
</select> 

但是每一次嘗試使它更加「Grails-ish」失敗。它如何塑造成Grails v2.2.1代碼?我花了數小時閱讀,嘗試,失敗。

回答

1

試試這個代碼:

<g:select optionKey="id" from="${Person.findAllByRole('developer')}" optionValue="${{it.fullName}}" value="${yourDomainInstance?.person?.id}" noSelection="['null':'Nobody']"></g:select> 

而在你的類:

class Person { 
.... 
String getFullName(){ 
    it?.firstname+' '+ it?.familyname 
} 

static transients = ['fullName'] 
.... 
} 

更多細節

+0

'optionValue =「it.fullName」'不起作用。你需要'optionValue =「$ {{it.fullName}}」' – 2013-03-20 18:33:50

+0

是的,你是對的。和optionValue =「fullName」?注意:保持簡單(= – 2013-03-21 10:01:29

+0

這最後一個建議是我最終使用的,我的解決方案越來越像這個,所以我檢查你的而不是 – serafim 2013-03-21 10:16:10

2

如果您woulkd喜歡使其更Grails的風格,您應該執行見g:select tag您在controllers \ services之內的所有邏輯都不在視圖中。

假設你有文件夾personPersonController在視圖createTodo,然後修改您的createTodo操作是這樣的:

class PersonController { 
    def createTodo() { 
     def developers = Person.findAllWhere(role: 'developer') 
     [developers: developers, ... /* your other values */] 
    } 
} 

所以你並不需要在您的視圖數據庫操作來處理。

下一步是使用g:select tag這樣的:

<g:select name="owner" from="${developers}" optionValue="${{'${it.firstName} ${it.familyName}'}}" noSelection="['null':'Nobody ...']" optionKey="id" value="${personInstance?.id}" /> 
+0

或者,您可以按照Cat先生的描述修改您的Person類,以簡化g:select標記的optionValue部分 – aiolos 2013-03-20 10:08:04

+0

我測試了@aiolos和@「貓先生」解決方案,並在我第一次進入Grails時發現了一些其他缺陷,但我將在最終實現中混合使用這兩種解決方案。一些upvotes,但我不被允許。 – serafim 2013-03-20 21:40:59

0

最後,我得到了它的工作,因爲我想和它的作品(幾乎)根據@解決方案「貓先生」。一個小細節,不過,「這並不在類存在,因此getFullName方法必須成爲:

String getFullName(){ 
    this?.firstname+' '+ this?.familyname 
} 

向上和工作,謝謝所有幫助。