2009-06-22 4 views
1

Ich habe Schwierigkeiten, dieses Validierungsproblem zu ermitteln. Ich habe eine übergeordnete Domäne Klasse wie folgt definiert:Validierungsfehler, die nicht in der Ansicht angezeigt werden

class Person { 
    String fullName 
    List telephones = [] 

    static hasMany = [telephones : Telephone] 

    static constraints = { 
     fullName(size:3..50, blank:false, nullable:false) 
    } 
} 

Dann wird ein sublcass:

class SalesAdvisor extends Person{ 
    Float comission //In percentage 
    Portfolio customerPortfolio 
    Inventory inventory 

    static constraints = { 
     comission(range:0..100, scale:2, nullable:false) 
     customerPortfolio(nullable:false) 
     inventory(nullable:false) 
    } 
} 

Im SalesAdvisorController speichere ich SalesAdvisor Instanzen:

def save = { 
    def portfolio = new Portfolio() 
    def inventory = new Inventory(name:'${params.fullName}Inventory', description:"${params.fullName}'s Inventory") 
    params.customerPortfolio = portfolio 
    params.inventory = inventory 
    def salesAdvisor = new SalesAdvisor(params) 

    if(!salesAdvisor.hasErrors() && salesAdvisor.save()){ 
     log.info("New instance of SalesAdvisor saved.") 
     redirect(action:show, id:salesAdvisor.id) 
    }else{ 
     log.error("There was an error saving the sales advisor.") 
     salesAdvisor.errors.allErrors.each{ 
     println it.code 
    } 
    render(view:'create', model:[salesAdvisor:SalesAdvisor]) 
    } 
} 

Um Fehler anzuzeigen, in der 'create' Ansicht habe ich:

Validierung scheint gut zu funktionieren. Wenn ich jedoch eine Zeichenfolge anstelle eines Floats für das Comission-Feld übergebe, kann ich in den Protokollen "typeMismatch" sehen, aber die Ansicht macht nichts! Die Datei message.properties enthält einen Standardeintrag für typeMismatch. Das selbe gilt für das FullName-Feld, in Protokollen kann ich "Nullable" und "Blank" -Fehler sehen, aber die Ansicht macht nichts.

Ich vermute, es ist mehr der Fehler der Ansicht als der Controller oder die Domäne, da Unit Tests verhalten sich wie sie sollten.

Antwort

2

Ich würde sagen, dass das Problem in Ihrem Modell-Passing-Code ein einfacher Tippfehler ist:

render(view:'create', model:[salesAdvisor:SalesAdvisor]) 

(beachten Sie die Groß- SalesAdvisor Wert). Versuchen

render(view:'create', model:[salesAdvisor:salesAdvisor]) 

Als Randbemerkung, gibt es einen Fehler in Ihrem Inventar Konstruieren Code:

name:'${params.fullName}Inventory' 

Sie sollten hier doppelte Anführungszeichen verwenden (GString).

+0

Ich bin nicht zu Hause, also kann ich es nicht versuchen, aber ich dachte immer, dass beim Übergeben eines Modells an die Ansicht (über die Modelllandkarte) der Schlüssel ist, wie die Ansicht auf den Wert und den Wert zugreifen wird ist die Domain-Klasse? Aber jetzt sehe ich, dass der Wert die Instanz selbst sein muss. – Cesar

+0

Nun, ich denke, der Begriff "Modell" ist ein bisschen überladen und damit mehrdeutig. Normalerweise verweisen Sie auf das Domänenmodell (das oft von einer Datenbank und einem ORM-Framework unterstützt wird) als Modell (das "M" in MVC). Die Karte, die Sie von einer Controller-Aktion zur Ansicht übergeben, ist eigentlich etwas anderes. Obwohl es oft Instanzen von Domänenmodellklassen enthält, sind Sie nicht darauf beschränkt. Sie können alle Werte übergeben, die Sie in Ihrer Ansicht verwenden möchten/müssen. In Ihrem Fall erwartet das renderErrors-Tag, dass salesAdvisor (bean = "$ {salesAdvisor}") eine Instanz einer Domänenklasse (die möglicherweise Fehler enthält) ist. –