Hallo Stefan,
danke fuer das Bereitstellen dieser Loesung. Ich habe die 3 Files Controller.groovy, renderEditor.template und list.gsp in /src/templates/scaffolding kopiert (von Deinem Source Code), ich kann auch am Parent-Ende der Many-To-Many bei einem Object Edit -> Assoc rufen, aber wenn ich dann ein Child auswaehle, bekomme ich einen Fehler
//choose/2
not found, HTTP 404, obwohl ich generate-all probiert habe und der Controller inklusive choose generiert wird. Hast Du vielleicht eine Idee?
Wie lautet denn die vollstaendige URL? vor dem "choose" muss ja der Name des Controllers stehen, in meinem Beispiel also "../book/choose/2".
Ansonsten schick mir einfach mal die generierte Anwendung, dann schau ich mal rein.
Gruss Stefan
Es scheint ein Problem zu geben, wenn die Domainklassen in Packages stecken. Dann wirft
def toUnlink = grailsApplication.getClassForName( params["class"] ).get(params["id"])
eine NullPointerException. Wenn ich den Paketnamen vorn anstelle (z.B.
def toUnlink = grailsApplication.getClassForName("de.example." + params["class"] ).get(params["id"])
funktioniert das ganze einwandfrei.
Gruß, Gregor!
Für Domainklassen in Paketen lässt sich auch in renderEditor.template 'class':'${property.referencedDomainClass.fullName}' angeben statt nur der name ohne Paket. Wenn die id etwas einfacher mit 'source.id':${domainInstance}?.id angegben wird kann die erste Zeile von link und unlink im Controller so aussehen:
def ${propertyName} = ${domainClass.fullName}.get(params["source.id"])
So hats bei mir mit Klassen in Paketen funktioniert.
"Richtiges Many-To-Many mit Grails" dachte ich, genau das was ich suche, super!
Aber: Mit den Anpassungen kann man zwar Associate/De-Associate durchführen, aber ein Add für n:m geht weiterhin nicht. Der Add-Link führt auf die Create-View der anderen Seite. Dort wird aber schon der übergebene Parameter nicht berücksichtigt, so dass der Rückweg nicht mehr funktioniert. D.h. man kann nur ein Objekt der anderen Seite anlegen, dieses wird aber nicht der ursprünglichen Seite zugeordnet. Außerdem erscheint nach dem Save die list-View der anderen Seite und nicht mehr die Edit-View aus der man gestartet ist.
Oder hab ich da jetzt was komplett falsch verstanden?
In der Tat, da gibt's noch ein Problem. Aber vielleicht kannst Du den Code ja ergänzen, ich komme leider im Moment gar nicht dazu.
Gruß Stefan
Ich habe ein paar Anregungen aus diesem Artikel nutzen können. Insbesondere sowas wie grailsApplication.getClassForName kannte ich vorher gar nicht und das war sehr nützlich. Vielen Dank dafür!
Damit konnte ich meine angepassten Core-Templates nochmal um ein weiteres Feature erweitern.
Ich habe dazu in einem anderen Forum was geschrieben:
http://www.groovy-forum.de/read.php?3,5222
existiert das Problem auch noch mit Grails 1.2? ich bekomme beim save die Fehlermeldung:
Executing action [save] of controller [BlaController] caused exception: org.springframework.dao.DataIntegrityViolationException: not-null property references a null or transient value: Bla._User_fooBackref; nested exception is org.hibernate.PropertyValueException: not-null property references a null or transient value: Bla._User_fooBackref
danke für nen Tipp
Sebastian