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

我是一个Grails noob,遇到了一个似乎是bug的东西,但完全有可能我没有正确配置所有东西。

我有两个简单的领域类:

   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)
    }
}

我有两个控制器,除了动态脚手架这两个域类之外什么都不做。

但即使我的数据库中有玩家名单,在创建新的团队时,我也没有为他们选择多选框。

但是,当我去编辑一个团队时,会出现多重选择

这是一个新项目动态脚手架中的错误,我误解了这应该如何工作,或者有什么我需要在这里声明?

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


我终于明白了这一点,并希望传递我为了防止其他人遇到它而做的事情。

当我为Team生成视图时,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>

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


是的,默认的脚手架在子类的“创建/编辑”页面中放置了一个父选择器。

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

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

static hasMany = [teams:Team]

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

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


我使用Grails的当前版本(v1.3.4)遇到了同样的问题。 必须手动修改create.gsp

链接地址: http://www.djcxy.com/p/42499.html

上一篇: Grails dynamic scaffold with hasMany: is it a bug or am I misconfiguring?

下一篇: Include PHP inside JavaScript (.js) files