2010-03-06 4 views
0

J'ai créé une balise personnalisée qui ressemble à ceci:Groovy/Grails validation et hasFieldErrors question

def textField = { attrs -> 
    def field = attrs.name.split('\\.')[-1] 
    log.error("--------- Field is ${field}") 
    if (attrs.bean && attrs.bean.errors.hasFieldErrors(field)) { 
     def className = attrs.remove('class') 
     def classStr = 'errors ' 
     if (className) { 
      classStr += className 
     } 
     attrs.put('class', classStr) 
     attrs.put('value', attrs.bean[field]) 
     attrs.remove('bean') 
    } 
    out << g.textField(attrs) 
} 

J'appelle dans mon GSP comme ceci:

<my:textField bean="${client}" name="client.firstName"/> 
<my:textField bean="${client}" name="client.lastName"/> 
... 
<my:textField bean="${client}" name="client.workPhone"/> 

Et voici ma domain-class

class Client { 

    String email 
    String address 
    String city 
    String state 
    String zip 
    String firstName 
    String lastName 
    String phone 
    String workPhone 
    String mobilePhone 
    String birthCountry 
    String citizenshipCountry 
    String emergencyContactName 
    String emergencyPhone 
    String disabilities 
    String experience 

    static constraints = { 
     email(email:true, unique:true, blank:false) 
     address(blank:false) 
     city(blank:false) 
     state(blank:false) 
     zip(blank:false) 
     firstName(blank:false) 
     lastName(blank:false) 
     phone(blank:false) 
     emergencyContactName(blank:false) 
     emergencyPhone(blank:false) 

     workPhone(blank:true, nullable:true) 
     mobilePhone(blank:true, nullable:true) 
     birthCountry(blank:true, nullable:true) 
     citizenshipCountry(blank:true, nullable:true) 
     disabilities(blank:true, nullable:true) 
     experience(blank:true, nullable:true) 
    } 

    static mapping = { 
     disabilities type: 'text' 
     experience type: 'text' 
    } 

    static hasMany = [courses:ClientCourseMap] 
} 

La page se charge correctement sauf lorsque j'ai un bean "client". Il charge tout le chemin jusqu'à la dernière balise "client.workPhone". Puis-je obtenir l'exception suivante:

2010-03-06 18: 32: 35329 [http-8080-2] ERREUR view.GroovyPageView - Erreur dans le traitement GroovyPageView: Erreur d'exécution: tag org.codehaus.groovy.grails .web.taglib.exceptions.GrailsTagException: Erreur lors de l'exécution de la balise: groovy.lang.MissingPropertyException: Aucune propriété: client pour la classe: com.personal.Client at/Users/dean/Projects/PersonalGrails/grails-app/views/enregistrement/index.gsp: 98 à /Users/dean/Projects/PersonalGrails/grails-app/views/registration/index.gsp:145

le problème est quand hasFieldErrors est appelé sur le haricot. Il passe dans "champ" qui devrait être "workPhone". Passer à travers un débogueur montre que ce champ est exactement "workPhone". Cependant, avec une inspection plus poussée dans la variable de champ, cela montre que la valeur interne du champ est "client.workPhone" et offset = 7, count = 9, hash = 0. Cependant, si vous appelez toString(), vous revenez " workPhone "comme vous l'attendez.

Je me demande de Grails ou peut-être même Spring n'utilise pas cette chaîne correctement? On dirait qu'il essaie d'utiliser la valeur réelle de cette chaîne au lieu de faire attention à l'offset/compte de cette chaîne et de récupérer ce qui est prévu.

Est-ce que quelqu'un voit quelque chose que je fais mal? Ou connaissez-vous une solution de contournement? Je peux donner toutes les informations nécessaires, il suffit de demander ... Cela me rend fou!

Répondre

1

Il semble que l'objectif de votre tag est de réduire la quantité de code GSP requis lors du rendu d'un formulaire. Avez-vous envisagé d'utiliser le plugin bean-fields à la place?

+0

Merci! Je suis nouveau pour les grails (venant des rails), donc je ne suis pas habitué à tout être un plugin et je ne pense pas à regarder les plugins avant de lancer le mien. C'est définitivement ce que j'essayais de faire. – intargc

+0

Ugh, nevermind ... pensait que cela ne fonctionnait pas avec les objets de commande, mais il semble que je l'utilisais incorrectement. – intargc