hasMany的Grails动态脚手架:它是一个错误还是我错误配置? [英] Grails dynamic scaffold with hasMany: is it a bug or am I misconfiguring?

查看:117
本文介绍了hasMany的Grails动态脚手架:它是一个错误还是我错误配置?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



有两个简单的领域类:

pre code类class Player {

字符串firstName
字符串lastName

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

  class Team {

字符串吉祥物;
static hasMany = [players:Player]

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

我有两个控制器,除了动态脚手架这两个Domain Classes之外什么也没有做。



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



然而,当我去编辑一个团队时出现了多重选择



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



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

解决方案

我终于明白了这一点,并希望传递我所做的以防其他人遇到它。



当我生成对于Team的观点,edit.gsp中的表单块如下所示:

 < input type =hiddenname = idvalue =$ {teamInstance?.id}/> 
< input type =hiddenname =versionvalue =$ {teamInstance?.version}/>
< div class =dialog>
< table>
< tbody>

< tr class =prop>
< td valign =topclass =name>
< label for =mascot> Mascot:< / label>
< / td>
< td valign =topclass =value $ {hasErrors(bean:teamInstance,field:'mascot','errors')}>
< input type =textid =mascotname =mascotvalue =$ {fieldValue(bean:teamInstance,field:'mascot')}/>
< / td>
< / tr>

< tr class =prop>
< td valign =topclass =name>
< label for =players>玩家:< / label>
< / td>
< td valign =topclass =value $ {hasErrors(bean:teamInstance,field:'players','errors')}>
from =$ {Player.list()}
size =5multiple =yesoptionKey =id
value =$ {teamInstance?.players}/>

< / td>
< / tr>

< / tbody>
< / table>
< / div>
< div class =buttons>
< span class =button>< g:actionSubmit class =savevalue =Update/>< / span>
< span class =button>< g:actionSubmit class =deleteonclick =return confirm('Are you sure?'); value =删除/>< / span>
< / div>
< / g:表格>

但create.gsp中的表单块如下所示:

 < g:form action =savemethod =post> 
< div class =dialog>
< table>
< tbody>

< tr class =prop>
< td valign =topclass =name>
< label for =mascot> Mascot:< / label>
< / td>
< td valign =topclass =value $ {hasErrors(bean:teamInstance,field:'mascot','errors')}>
< input type =textid =mascotname =mascotvalue =$ {fieldValue(bean:teamInstance,field:'mascot')}/>
< / td>
< / tr>

< / tbody>
< / table>
< / div>
< div class =buttons>
< span class =button>< input class =savetype =submitvalue =Create/>< / span>
< / div>
< / g:表格>换句话说,对于这种情况,默认的创建视图省略了小部件以正确显示多行 - 选择列表。当我复制和粘贴缺少的代码时,动态脚手架的控制器将其捡起并按预期保存。所以,这绝对是视图生成代码中的一个错误。


I'm a Grails noob and running into something that seems to be a bug, but it is entirely possible I'm not configuring everything correctly.

I've got two simple Domain Classes:

   class Player {

        String firstName
        String lastName

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

and

class Team {

    String mascot;
    static hasMany = [players:Player]

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

I have controllers for both that do nothing beyond dynamic scaffold these two Domain Classes.

But even when I have a list of Players in my DB, I don't get a multi-select box for them when creating a new Team.

However, the multi-select shows up when I go to edit a Team

Is this a bug in the dynamic scaffolding for new items, do I misunderstand how this is supposed to work, or is there something else I need to declare here?

Any help is hugely appreciated! I've got screenshots that StackOverflow won't let me add because of my newness, but I'd be happy to show them another way if that'll help.

解决方案

I finally figured this out and wanted to pass on what I did just in case someone else runs into it.

When I generated the views for Team, the form block in edit.gsp looks like this:

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

but the form block in create.gsp looks like this:

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

In other words, for this corner case, the default Create view omits the widget to properly display the multi-select list. When I did a copy and paste of the missing code, the dynamically scaffolded controller picked it up and persisted it as expected. So, it's definitely a bug in the view generation code.

这篇关于hasMany的Grails动态脚手架:它是一个错误还是我错误配置?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆