2012-06-03 3 views
7

Gibt es eine gute/standardmäßige Möglichkeit, einen gemeinsamen Code vor jedem Aufruf von save() auf Domänenklassen auszuführen?Grails - wie Code vor jedem Speichern ausführen?

Zum Beispiel meine Domain

class Page { 

    String url 
    Boolean processed 
    Date date 
    Integer urlCrc 
} 

Meine Form hat nur drei ersten Felder, und ich möchte urlCrc die save() jedes Mal berechnen Methode aufgerufen wird. Ich kann die Speichermethode nicht einfach überschreiben, weil sie injiziert wird.

Antwort

16

Sie können GORM-Ereignisse verwenden - siehe docs. Da standardmäßig validate() vor jeder save() aufgerufen wird, würde ich das verwenden.

class Page { 
    //your defs here 

    def beforeValidate() { 
     this.urlCrc = yourComputationHere 
    } 
} 
+0

Dank, es funktioniert. Leider ist grails.org down, wegen einiger Routing-Probleme http://grails.1312388.n4.nabble.com/Is-the-plugin-repository-down-td4628824i40.html so brauchte ich hier fragen – mrok

+0

Das obige Lösung ist wahrscheinlich am besten, aber eine andere Möglichkeit besteht darin, ein grailsberechnetes Feld zu verwenden. Siehe dazu die Dokumentation. –

+1

Wenn Sie den Code vor dem Speichern ausführen möchten, verwenden Sie 'beforeUpdate()/beforeInsert()'. Wenn Sie 'beforeValidate()' verwenden, heißt das immer, wenn Sie 'validate()' aufrufen (Methode 'save()' call 'validate()' vor dem Speichern). Also wird Ihr Code vor der Validierung ausgeführt, auch wenn Sie nicht speichern. – IgniteCoders

1
class Page { 
    def beforeInsert() { 
     this.beforeUpdate() 
    } 
    def beforeUpdate() { 
     this.urlCrc = 'calculate something' 
    } 
} 
+1

können Sie die Dokumentation dazu verlinken? – dopatraman

+0

Ja, das ist die [Dokumentation] (http://docs.grails.org/1.3.6/guide/5.%20Object%20Relational%20Mapping%20 (GORM) .html # 5.5% 20Advanced% 20GORM% 20Features) – IgniteCoders