Grails索引参数

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在地图的kidseedv.

我希望这回答了你的问题.

  • 我想知道是否有其他人在让这个工作上遇到麻烦.使用grails 1.3.4,而不是获得预期的子映射,我得到的东西看起来像子映射的字符串表示.例如,params.toString()"[filters.1.value:123,filters:["1":["value":"123"],"1.value":"123"],action:list,controller :用户]" (2认同)

fox*_*nut 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> 
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)

奇迹般有效.