| 

.NET C# Java Javascript Exception

create verschachtete Objekte

Dies ist das Archiv des ehemaligen Forums zum Thema Groovy, Grails, Griffon und Bean Scripting Framework, welches unter groovy-forum.de existierte. Die neue Adresse des Groovy-Forums ist: http://codekicker.de/fragen/themen/groovy.


create verschachtete Objekte

gerolsteiner09 - 24.07.2008 17:23
Hallo,

meine Domain Klasse "Project" hat eine hasMany relation zu einer anderen Domain Klasse "Machine". Da Machine ein recht komplexes Objekt ist, würde ich gerne im create.gsp von "Project" einen Link "add Machine" anzeigen, so dass der Benutzer dadurch auf eine andere Seite kommt und da seine Maschinendaten eingibt. Nach der Eingabe soll der Benutzer wieder zurück auf die ursprüngliche Projekt-create-Site zurückgeführt werden, um mit dem Ausfüllen von Projektdaten fortzusetzen.

Also so: "create project" -> "create machine" -> "create project"

Ich habe verschiedene Varianten probiert, habe aber immer noch keine Lösunge gefunden: Das Projekt wird nämlich nicht erzeugt. Es sind folgende Probleme (zumindest glaube ich, dass sie schuld sind.)
1. Nachdem eine Machine erzeugt ist, muss er mit dem Projekt in Verbindung gebracht werden. Da aber das Projekt selbst noch in "creation" ist und noch nicht gespeichert wird, gibt es kein Projekt, worauf sich die Machine beziehen kann. Es gibt nämlich noch keine ID für das Projekt.
2. Aus dem obigen Grund kann man auch nicht so ohne weiteres von der Seite der "create machine" auf die "create project" mit dem ursprünglichen Projektdaten zurückkommen. Daraufhin kann man auch nie auf die "create" button von "create Project" klicken, so dass es tatsächlich erzeugt wird.

Gibt es dazu eine Lösung?

vielen Dank für eure Hilfe!


Gerolsteinier


Re: create verschachtete Objekte

christian - 24.07.2008 17:47
Hallo,

du könntest die Daten, die auf der Seite "create project" angegeben werden, auf der Seite "create machine" als versteckte Formularfelder ausgeben (dabei könnte der Scope "flash" nützlich sein), wenn das Formular abgeschickt wird, wird die Maschine angelegt und die zusätzlich übertragenen Daten aus dem ersten Schritt werden wieder auf der urpsprünglichen Seite angezeigt.

Wenn du nicht mit Speicherplatz (im Hauptspeicher) geizen musst und nicht Gefahr besteht, dass innerhalb eine Sitzung mehrerer dieser Vorgänge parallel bearbeitet werden, könntest du die Eingaben auch einfach im Session-Objekt parken.

Gruß
Christian


Re: create verschachtelte Objekte

gerolsteiner09 - 25.07.2008 15:57
Hallo Christian und Horst,

vielen Dank für eure Tipps!

Ich versuche nun, das Problem so zu lösen:

Ich teile das create-Aufgabe in meheren aufeinanderfolgenden websites. Auf der ersten Seite soll der Benutzer "General Information" über das Projekt eingeben, beim Klicken vom "Weiter"-Button wird validiert und ein Projekt angelegt. Auf der zweiten Seite kommt dann die Eingabemaske für Machine. Wenn der Benutzer fertig ist mit der Eingabe, wird eine Machine-Objekt angelegt und dem Projekt "geadded". Man kann nun hin- und zurücknavigieren. Es gibt noch diverse andere komplexe Objekte wie Machine, die dem Projekt hinzugefügt werden sollen und ich habe vor, sie alle so zu realisieren.

Das Problem jetzt ist aber, dass ich die Projektinstanz, die ich zu Beginn angelegt habe, über mehere Closure-Views beibehalten muss, damit die komplexen Objekte alle geadded werden können. Kann man so etwas ähnliches wie eine "globale Variable" wie bei Java definieren, die über alle closure in einer Controller Klasse gültig sind? Wie sonst kann man das realisieren? Wie macht man das mit Session?

vielen Dank im voraus!

Gerolsteiner


Re: create verschachtelte Objekte

christian - 25.07.2008 16:06
gerolsteiner09 schrieb:
-------------------------------------------------------

> Das Problem jetzt ist aber, dass ich die
> Projektinstanz, die ich zu Beginn angelegt habe,
> über mehere Closure-Views beibehalten muss,

Meinst du mit "Closure-Views" Seiten?

> damit
> die komplexen Objekte alle geadded werden können.
> Kann man so etwas ähnliches wie eine "globale
> Variable" wie bei Java definieren,

Bei Java gibt es keine globalen Variablen.

> die über alle
> closure in einer Controller Klasse gültig sind?

Bei jeder Anfrage wird eine neue Controller-Instanz erzeugt. In einem Controller-Objekt, außerhalb einer Closure etwas für weitere Requests zu speichern, ist also aussichtslos.

> Wie sonst kann man das realisieren?

Am saubersten wäre es, die ID des Projekts in einem versteckten Feld durchzuschleifen.

> Wie macht man das mit Session?

Man setzt eine Variable im Session-Scope und liest sie bei der nächsten Anfrage wieder aus. Aber das würde ich nach Möglichkeit vermeiden.

Gruß
Christian


Re: create verschachtelte Objekte

gerolsteiner09 - 25.07.2008 17:25
Ich habe's hingekriegt! Danke schön!

Ich weiß nicht ganz genau, was du mit "Verstecken der Projekt-ID" meinst. Das hin- und hertransportieren von Parameter zwischen View und Controller habe ich so gemacht:

---------------------------------------------------------------------
ProjectController.groovy:

def createMachine = {
...
return ['machine':machine, 'project':project]
}
---------------------------------------------------------------------
createMachine.gsp:
...

<g:form action="saveMachine" params="[project:project, id:project.id]">
...
---------------------------------------------------------------------

Hast du etwa eine elegantere Lösung?

Vielen Dank und schöne Grüße

Gerolsteiner


Stelle deine Groovy-Frage jetzt!


Diese Seite zeigt den Thread "create verschachtete Objekte" der ehemaligen Webseite groovy-forum.de, welche durch einen Serverunfall zerstört wurde. codekicker.de hat viele Konversationen über die beliebte Programmiersprache Groovy und zugehörige Frameworks wie das Grails-Framework retten können.

Hast Du eine Frage zum Thema Groovy, Grails oder allgemein Java? Viele ehemalige groovy-forum.de Mitglieder beantworten dir auf codekicker.de deine Frage! Stelle jetzt eine Frage!

Viele weitere Diskussionen zu Grails und Groovy befinden sich auf der Threadübersicht des alten groovy-forum.de.