fox*_*nut 8 grails indexed properties
我有一个Team具有Integer seed属性的对象列表.我想一次性编辑所有球队的种子.我确信 Grails支持索引参数,但我无法让它工作.
这里是我有什么,和它的作品,但我通过跳跃的方式太多铁圈和有一定有一个更好的办法.
GSP:
<g:form action="setSeeds">
...
<g:each in="${teams}" status="i" var="team">
<input type="hidden" name="teams[${i}].id" value="${team.id}">
<input type="text" size="2" name="teams[${i}].seed" value="${team.seed}">
</g:each>
</g:form>
Run Code Online (Sandbox Code Playgroud)
控制器:
def setSeeds = {
(0..<30).each { i ->
def team = Team.get(Integer.parseInt(params["teams[${i}].id"]))
team.seed = Integer.parseInt(params["teams[${i}].seed"])
}
redirect(action:list)
}
Run Code Online (Sandbox Code Playgroud)
这不是很糟糕吗?太吵了.我怎样才能做到以下几点:
params.teams.each { t ->
def team = Team.get(t.id)
team.seed = t.seed
}
Run Code Online (Sandbox Code Playgroud)
也就是说,我该如何映射命名PARAMS team[0].seed,team[0].id,team[1].seed,team[1].id到清单?
在Stripes中你可以拥有一个List<Team>属性,它就可以工作了.我希望Grails不会少!;-)
在此先感谢您的帮助.
Ste*_*ter 11
params不仅仅是一个常规Map,它是一个GrailsParameterMap基于将参数名称拆分为"."来自动构建子Map结构的.您可以通过使用以下gsp来利用此功能:
<g:form action="seed">
<g:each in="${teams}" status="i" var="team">
<input type="hidden" name="teams.${i}.id" value="${team.id}">
<input type="text" size="2" name="teams.${i}.seed" value="${team.seed}">
</g:each>
<g:submitButton name="update" value="Update" />
</g:form>
Run Code Online (Sandbox Code Playgroud)
注意:名称属性中没有[].现在使用一些黑色的Grails魔法控制器非常简单:
log.error "params = ${params}"
params.teams.findAll {k,v -> !k.contains(".")}.each { k,v ->
bindData(Team.get(v.id), v)
}
Run Code Online (Sandbox Code Playgroud)
第一个操作findAll过滤掉所有带有内部点的参数.剩下的就是图保持行ID在地图的k和id和seed的v.
我希望这回答了你的问题.
我终于想出了如何在没有任何恶作剧的情况下做到这一点.
忘记隐藏参数,只需在种子参数中使用团队ID.在GSP中:
<g:form action="setSeeds">
...
<g:each in="${teams}" var="team">
<input type="text" size="2" name="teams.seeds.${team.id}"
value="${team.seed}">
</g:each>
</g:form>
Run Code Online (Sandbox Code Playgroud)
然后,在控制器中:
params.teams.seeds.each { teamId, seed ->
def team = Team.get(teamId.toInteger())
team.seed = seed.toInteger()
team.save()
}
redirect(action:list)
Run Code Online (Sandbox Code Playgroud)
奇迹般有效.