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!
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
Ugh, nevermind ... pensait que cela ne fonctionnait pas avec les objets de commande, mais il semble que je l'utilisais incorrectement. – intargc