2009-05-05 39 views
7

我是一個Grails noob,遇到了一個似乎是bug的東西,但完全有可能我沒有正確配置所有東西。具有hasMany的Grails動態腳手架:它是一個錯誤還是我錯誤配置?

我有兩個簡單的域類:

class Player { 

     String firstName 
     String lastName 

     static constraints = { 
      firstName(blank:false) 
      lastName(blank:false) 
     } 
     String toString() { lastName + ", " + firstName } 
    } 

class Team { 

    String mascot; 
    static hasMany = [players:Player] 

    static constraints = { 
     mascot(blank:false) 
    } 
} 

我什麼也不做,超出動態腳手架這兩個域類兩個控制器。

但是,即使我在DB球員的名單,我不創建一個新的團隊時,得到他們的一個多選框。

然而,多選顯示出來,當我去編輯團隊

這是在新項目的動態腳手架的錯誤,我誤解這是如何工作的,或者是有別的我需要在這裏申報?

任何幫助非常感謝!我有截圖StackOverflow不會讓我添加,因爲我的新穎,但我很樂意給他們另一種方式,如果這將有所幫助。

回答

1

是,默認的腳手架在子類中創建/編輯頁面使家長選擇。

我猜它只是爲他們更容易這樣。它不應該是一個多重選擇,只是一個下拉單選,因爲它是一對多的。

正如你解釋你想更多的是許多對許多關係,你可以嘗試添加:

static hasMany = [teams:Team] 

你Player類。我發現Grails在雙向關係方面表現更好。在構建搜索查詢時也很有用,並且不應超過您已經需要的一個關係表。

如果您在使用Grails的預V1.1,多到多的關係不直接支持,所以即使加上上面的靜態的hasMany不會是完整的解決方案,因爲你需要管理添加到另一個列表時添加到一個方向。我還沒有使用過v1.1,所以我不能說說需要什麼來指定其中的多對多。

+0

感謝您的回覆Bill。 我想我的榜樣可能會更好,我想讓一名球員成爲不止一支球隊的成員。它實際上比一對多更多。這就是爲什麼我在播放器上沒有belongsTo的原因,但是現在我發現我碰巧選擇的用例可能會導致混淆。 對我來說很奇怪的是,多選按預期顯示在編輯屏幕上,但不在創建屏幕上。這種不一致使我認爲這是動態腳手架中的一個錯誤,但我幾乎不會犯錯(明顯) – Pete 2009-05-05 16:31:34

2

我終於想通了這一點,並希望通過對我做了什麼,以防萬一別人跑了進去。

當我生成團隊的意見,在edit.gsp形式塊看起來是這樣的:

<input type="hidden" name="id" value="${teamInstance?.id}" /> 
       <input type="hidden" name="version" value="${teamInstance?.version}" /> 
       <div class="dialog"> 
        <table> 
         <tbody> 

          <tr class="prop"> 
           <td valign="top" class="name"> 
            <label for="mascot">Mascot:</label> 
           </td> 
           <td valign="top" class="value ${hasErrors(bean:teamInstance,field:'mascot','errors')}"> 
            <input type="text" id="mascot" name="mascot" value="${fieldValue(bean:teamInstance,field:'mascot')}"/> 
           </td> 
          </tr> 

          <tr class="prop"> 
           <td valign="top" class="name"> 
            <label for="players">Players:</label> 
           </td> 
           <td valign="top" class="value ${hasErrors(bean:teamInstance,field:'players','errors')}"> 
            <g:select name="players" 
from="${Player.list()}" 
size="5" multiple="yes" optionKey="id" 
value="${teamInstance?.players}" /> 

           </td> 
          </tr> 

         </tbody> 
        </table> 
       </div> 
       <div class="buttons"> 
        <span class="button"><g:actionSubmit class="save" value="Update" /></span> 
        <span class="button"><g:actionSubmit class="delete" onclick="return confirm('Are you sure?');" value="Delete" /></span> 
       </div> 
      </g:form> 

但create.gsp形式塊看起來是這樣的:

<g:form action="save" method="post" > 
       <div class="dialog"> 
        <table> 
         <tbody> 

          <tr class="prop"> 
           <td valign="top" class="name"> 
            <label for="mascot">Mascot:</label> 
           </td> 
           <td valign="top" class="value ${hasErrors(bean:teamInstance,field:'mascot','errors')}"> 
            <input type="text" id="mascot" name="mascot" value="${fieldValue(bean:teamInstance,field:'mascot')}"/> 
           </td> 
          </tr> 

         </tbody> 
        </table> 
       </div> 
       <div class="buttons"> 
        <span class="button"><input class="save" type="submit" value="Create" /></span> 
       </div> 
     </g:form> 

在換句話說,對於這種情況,默認的創建視圖省略了小部件以正確顯示多選列表。當我複製和粘貼缺少的代碼時,動態腳手架的控制器將其撿起並按預期保存。所以,這絕對是視圖生成代碼中的一個錯誤。

1

我遇到使用Grails的當前版本(V1.3.4)同樣的問題。不得不手動修改create.gsp

相關問題