Frage

Ich habe eine Liste von Team Objekten, die eine Integer seed Eigenschaft. Ich möchte, dass alle Teams Samen auf einmal in einer einzigen Form, bearbeiten. Ich bin sicher , dass Grails indizierte Parameter unterstützt, aber ich kann es nicht arbeiten.

Hier ist, was ich habe, und es funktioniert, aber ich bin springend durch Weg zu viele Reifen und es muss doch einen besseren Weg geben.

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>

Controller:

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

Ist das nicht schrecklich? Viel zu viel Lärm.

: Wie kann ich etwas entlang der Linien von tun
params.teams.each { t ->
  def team = Team.get(t.id)
  team.seed = t.seed
}

Das heißt, wie ordne ich params genannt team[0].seed, team[0].id, team[1].seed, team[1].id auf eine Liste?

Stripes Sie können einfach eine List<Team> Eigenschaft haben, und es wird funktionieren. Ich erwarte nicht weniger von Grails! ; -)

Vielen Dank im Voraus für Ihre Hilfe.

War es hilfreich?

Lösung 2

ich endlich herausgefunden, wie dies ohne Spielereien zu tun.

Vergessen Sie die versteckten Parameter und verwenden Sie nur die Team-ID in den Seed-Parametern. Im 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> 

Dann in der Steuerung:

params.teams.seeds.each { teamId, seed ->
  def team = Team.get(teamId.toInteger())
  team.seed = seed.toInteger()
  team.save()
}
redirect(action:list)

Funktioniert wie ein Zauber.

Andere Tipps

params ist mehr als eine normale Karte, es ist ein GrailsParameterMap die Unter Karte Strukturen automatisch auf eine Aufteilung der Parameternamen auf Basis aufbaut durch ‚‘. Sie könnten dies nutzen, indem Sie die folgende gsp mit:

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

NB: Es gibt keine [] im Namen zuschreibt. Die Steuerung ist nun ziemlich einfach einige schwarze Grails Magie:

log.error "params = ${params}"
params.teams.findAll {k,v -> !k.contains(".")}.each { k,v ->
       bindData(Team.get(v.id), v)
}

Die erste Operation findAll filtert alle Parameter mit einem Punkt von innen nach außen. Der Rest ist eine Karte von Karten, um die Zeilen-ID in k und die id und seed in v halten.

Ich hoffe, Ihre Frage damit beantwortet.

Im Jahr 2015 .... Grails funktioniert ein wenig anders und Sie können sich in Strings ausgeführt finden, anstatt die erwartete Unter maps.I etwas, indem Sie
arbeiten bekam so etwas wie ..

params.nested.each{
               if(!it.getKey().contains('.')){
                 //to get a map rather than a string...    
                  params.nested[it.getKey()];
               }
           };

EDIT: Übrigens ...

Eingänge, die den gleichen Namen haben, wie

  <input name="item.choice" type="checkbox" value="3" />
  < input name="item.choice" type="checkbox" value="4"/>

Sind in eine Liste setzen, wenn mehr als ein vorgelegt werden. Also, wenn beide der oben genannten wurden überprüft

   <input name="item.choice" type="checkbox" value="3" checked />
   < input name="item.choice" type="checkbox" value="4" checked/>

Sie würden eine Liste erhalten.

Aber wenn nur ein aktiviert ist bekommt man nicht eine List (zumindest in Grails verison ich verwende), Sie einen einzelnen Wert erhalten.

     <input name="item.choice" type="checkbox" value="3" checked />
     < input name="item.choice" type="checkbox" value="4" />

Das bedeutet, dass in einem Controller, wenn ich etwas zu tun, war wie

  params['item.choice'].each{
          def item=Item.get(it)
  }

Es würde einen Fehler aus, wenn nur ein Element vorgelegt wurde. Eine groovy Art und Weise, dies zu umgehen ist

 ([]+(params['item.choice']?:[])).each{
         def item=Item.get(it)
 } 

Wenn der Parameter gesetzt ist und nicht eine Liste, setzt es den Wert in die leere Liste; Wenn der Parameter und eine Liste gesetzt wird, wird der Plus-Operator alle einzelnen Werte in die leere Liste hinzuzufügen; wenn die Parameter nicht gesetzt ist, wird es zwei leere Listen zusammen, die eine einzige leere Liste erstellt.

Nicht sicher, ob das hilft, aber man könnte einen Verschluss mit ihm wie verwenden:

<g:each in="${teams}">
     <p>id: ${it.id}</p>
     <p>seed: ${it.seed}</p>
</g:each>

Sie könnten wahrscheinlich eine Liste bauen aus diesem instaed html auszugeben. oder bauen Sie Ihre Form mit.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top