我有一个具有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>
控制器:
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)
}
这不是很糟糕吗?太吵了。我怎样才能做一些事情:
params.teams.each { t ->
def team = Team.get(t.id)
team.seed = t.seed
}
也就是说,如何将名为team[0].seed
,team[0].id
,team[1].seed
,team[1].id
的参数映射到列表?
在Stripes中,您可以拥有List<Team>
属性,它只会有效。我希望Grails不会少! ; - )
提前感谢您的帮助。
答案 0 :(得分: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>
注意:名称属性中没有[]。现在使用一些黑色的Grails魔法控制器非常简单:
log.error "params = ${params}"
params.teams.findAll {k,v -> !k.contains(".")}.each { k,v ->
bindData(Team.get(v.id), v)
}
第一个操作findAll
过滤掉内部带点的所有参数。其余的是地图地图,其中包含k
中的行ID以及id
中的seed
和v
。
我希望这能回答你的问题。
答案 1 :(得分:6)
我终于想出了如何在没有任何恶作剧的情况下做到这一点。
忘记隐藏参数,只使用种子参数中的团队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>
然后,在控制器中:
params.teams.seeds.each { teamId, seed ->
def team = Team.get(teamId.toInteger())
team.seed = seed.toInteger()
team.save()
}
redirect(action:list)
像魅力一样。
答案 2 :(得分:1)
2015年...... 现在Grails的工作方式略有不同,你可能会发现自己遇到了字符串,而不是预期的子映射。我有一些工作要做 类似......
params.nested.each{
if(!it.getKey().contains('.')){
//to get a map rather than a string...
params.nested[it.getKey()];
}
};
编辑:顺便说一下......
具有相同名称的输入,例如
<input name="item.choice" type="checkbox" value="3" />
< input name="item.choice" type="checkbox" value="4"/>
如果提交的话多于一个列表。因此,如果上述两个都被检查
<input name="item.choice" type="checkbox" value="3" checked />
< input name="item.choice" type="checkbox" value="4" checked/>
你会得到一份清单。
但是如果只检查一个你没有得到一个List(至少在我使用的grails verison中),你得到一个值。
<input name="item.choice" type="checkbox" value="3" checked />
< input name="item.choice" type="checkbox" value="4" />
这意味着在控制器中,如果我要执行类似
的操作 params['item.choice'].each{
def item=Item.get(it)
}
如果只提交了一个项目,则会抛出错误。一种巧妙的解决方法是
([]+(params['item.choice']?:[])).each{
def item=Item.get(it)
}
如果参数设置而不是列表,则将值放入空列表中;如果设置了参数和列表,则加号运算符会将所有单个值添加到空列表中;如果未设置参数,则会将两个空列表一起添加,这将创建一个空列表。
答案 3 :(得分:-1)
不确定这是否有帮助,但你可以使用它的闭包,如:
<g:each in="${teams}">
<p>id: ${it.id}</p>
<p>seed: ${it.seed}</p>
</g:each>
你可以从这个输出html的insta中建立一个列表。或用它来建立你的表格。