具有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,所以我不能说说需要什么来指定其中的多对多。
我终于想通了这一点,并希望通过对我做了什么,以防万一别人跑了进去。
当我生成团队的意见,在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
感谢您的回复Bill。 我想我的榜样可能会更好,我想让一名球员成为不止一支球队的成员。它实际上比一对多更多。这就是为什么我在播放器上没有belongsTo的原因,但是现在我发现我碰巧选择的用例可能会导致混淆。 对我来说很奇怪的是,多选按预期显示在编辑屏幕上,但不在创建屏幕上。这种不一致使我认为这是动态脚手架中的一个错误,但我几乎不会犯错(明显) – Pete 2009-05-05 16:31:34