具有hasMany的Grails动态脚手架:它是一个错误还是我错误配置?

问题描述:

我是一个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球员的名单,我不创建一个新的团队时,得到他们的一个多选框。

然而,多选显示出来,当我去编辑团队

这是在新项目的动态脚手架的错误,我误解这是如何工作的,或者是有别的我需要在这里申报?

任何帮助非常感谢!我有截图*不会让我添加,因为我的新颖,但我很乐意给他们另一种方式,如果这将有所帮助。

是,默认的脚手架在子类中创建/编辑页面使家长选择。

我猜它只是为他们更容易这样。它不应该是一个多重选择,只是一个下拉单选,因为它是一对多的。

正如你解释你想更多的是许多对许多关系,你可以尝试添加:

static hasMany = [teams:Team] 

你Player类。我发现Grails在双向关系方面表现更好。在构建搜索查询时也很有用,并且不应超过您已经需要的一个关系表。

如果您在使用Grails的预V1.1,多到多的关系不直接支持,所以即使加上上面的静态的hasMany不会是完整的解决方案,因为你需要管理添加到另一个列表时添加到一个方向。我还没有使用过v1.1,所以我不能说说需要什么来指定其中的多对多。

+0

感谢您的回复Bill。 我想我的榜样可能会更好,我想让一名球员成为不止一支球队的成员。它实际上比一对多更多。这就是为什么我在播放器上没有belongsTo的原因,但是现在我发现我碰巧选择的用例可能会导致混淆。 对我来说很奇怪的是,多选按预期显示在编辑屏幕上,但不在创建屏幕上。这种不一致使我认为这是动态脚手架中的一个错误,但我几乎不会犯错(明显) – Pete 2009-05-05 16:31:34

我终于想通了这一点,并希望通过对我做了什么,以防万一别人跑了进去。

当我生成团队的意见,在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> 

在换句话说,对于这种情况,默认的创建视图省略了小部件以正确显示多选列表。当我复制和粘贴缺少的代码时,动态脚手架的控制器将其捡起并按预期保存。所以,这绝对是视图生成代码中的一个错误。

我遇到使用Grails的当前版本(V1.3.4)同样的问题。不得不手动修改create.gsp