2010-10-22 4 views
0

Je dois valider l'action de sauvegarde entre 3 domaines, voici la relation:Problème de validation Grails sur une association multi-domaine?

Utilisateur - JobProcess: un-à-plusieurs, JobProcess - Heatmap: un-à-plusieurs.

User { static hasMany = [ jobs : JobProcess ] ... } 
JobProcess { static hasMany = [ heatmaps : Heatmap ] ... User script ... } 
Heatmap { static belongsTo = JobProcess ... JobProcess job ... } 

J'utilise des exceptions pour contrôler le flux de validation, voici ma classe de validation:

class ValidationException extends RuntimeException { 
    Object invalidObject 
    ValidationException(String message, Object invalidObject) { 
    super(message) 
    this.invalidObject = invalidObject 
    } 
} 

Je construis aussi une classe de service aux opérations abstraites HeatMap (et se fixe params données objet):

def addJob(params) { 

    def user = User.findById(params.user_id) 

    if (user) { 

    def heatmap = new Heatmap(params) 

    def process = new JobProcess(params) 

     process.addToHeatmaps(heatmap) 
     user.addToJobs(process) 

    if (user.save()) { 
     return heatmap 
    } else { 
     throw new ValidationException("Invalid form", heatmap) 
     } 
    } 
} 

Et mon contrôleur:

try { 
    def heatmap= HeatmapService.addJob(params) 
     flash.message = "Running new process : $heatmap.job}" 
     redirect(uri:'/') 
    } catch (ValidationException che) { 
    flash.message = "Validation Failed ${che.message}" 
    render(view:'create', model:[heatmap:che.invalidObject]) 
    } 

Mon premier numéro: Je n'ai aucune validation d'erreur en utilisant: user.save() - pourquoi aucune validation n'est effectuée?
Je peux résoudre ce problème acheter la mise à jour if (user.save()) par: if (heatmap.validate() & & user.save()).
Y a-t-il une meilleure façon de procéder?

Mon deuxième numéro: ma redirection ne déclenche pas d'exception post-invalide.
Je suis redirigé vers ma vue de création, mais tous mes champs sont vides (j'ai perdu tous les champs d'information) et aucune erreur de validation.
Néanmoins, j'utilise model: [heatmap: che.invalidObject].
A l'exception, je repasse l'objet invalidObject, donc mon affichage de création devrait afficher les erreurs de validation exactes? Qu'est-ce qui ne va pas ?

Merci

+1

1. Pouvez-vous également citer le validateur violé? 2. Pouvez-vous aussi essayer de rendre juste une $ heatmap visible et voir ce qu'il y a? Ressemble plus à une faute de frappe. –

Répondre

0

Je trouve mon problème, il est dû à mon avis GSP, j'utilisais le mauvais grain:

<td valign="top" class="value ${hasErrors(bean: heatmapInstance, field: 'project_name', 'errors')}"> 

Alors, je mis à jour à heatmap, et maintenant je reçois ma validation d'erreur:

<td valign="top" class="value ${hasErrors(bean: heatmap, field: 'project_name', 'errors')}"> 

Merci Victor.