2011-11-30 1 views
0

J'ai une classe Person avec deux propriétés: name et address. Je veux créer une page GSP qui permet de créer 10 utilisateurs à la fois. Voici comment je l'implémente et je me demandais s'il y avait une meilleure façon:Comment créer plusieurs objets de domaine à partir d'une page GSP

D'abord, faites 20 zones de texte dans la page GSP - 10 avec someperson.name et 10 avec someperson.address noms de champs (faites-les dans une boucle ou un code tous individuellement, peu importe).

Ensuite, traitez les données soumises dans le contrôleur. L'objet someperson a les données soumises, mais dans une structure pas si belle ([name: ['Bob', 'John'], address: ['Address 1', 'Address 2']]), donc j'appelle le transpose() pour pouvoir accéder aux paires , address.

Ensuite, créez une liste d'objets Person en utilisant les paires obtenues à l'étape précédente et validez/enregistrez-les.

Enfin, si la validation échoue (name ne peut pas être null) alors faites quelque chose ... ne sais pas encore! Je pense à passer la collection des objets Person au GSP où ils sont itérés en utilisant une boucle et si hasErrors puis les montrer ... Ne sait pas comment mettre en évidence les champs qui ont échoué validation ...

Ainsi , y a-t-il un meilleur moyen (je devrais probablement demander QUEL EST le meilleur moyen)?

Répondre

1

Vous devez utiliser le support de liaison de données de Grails en déclarant un objet de commande comme

class PersonCommand { 

    List<Person> people = [] 
} 

Si vous construisez votre formulaire afin que les paramètres de la requête sont nommés comme ceci:

person[0].name=bob 
person[0].address=england 
person[1].name=john 
person[1].address=ireland 

Le les données seront automatiquement liées à l'argument personCommand de l'action de ce contrôleur

class MyController { 

    def savePeople = {PersonCommand personCommand-> 

    } 
} 

Si vous appelez personCommand.validate() il pourrait à son tour appeler validate() sur chaque Person en people (je ne suis pas sûr). Si cela ne vous pouvez le faire vous-même en appelant

boolean allPersonsValid = personCommand.people.every {it.validate()} 

À ce stade, vous saurez si tous les cas Person sont valides. Si elles ne sont pas, vous devriez passer le PersonCommand retour au SGP et vous pouvez utiliser les balises Grails:

  • <g:eachError>
  • <g:hasErrors>
  • <g:renderErrors>

pour mettre en surbrillance les champs erreurs. Si vous ne savez pas exactement comment utiliser ces balises pour faire la mise en surbrillance, je vous suggère d'exécuter grails generate-all pour une classe de domaine et de regarder le code GSP qu'elle génère.

+0

Comment Grails sait-il lier 'personne' de la requête à l'objet de commande? Je m'attendrais à ce que les paramètres soient requis en tant que 'people [0] .name = bob' – zoran119

+0

Je continue d'obtenir' Erreur lors de la création de l'objet de commande.'et' Message d'exception: Index: 1, Taille: 0' avec ce code http://pastie.org/2951846 Une idée pourquoi? – zoran119

+0

jeter un oeil à la réponse à cette question http://stackoverflow.com/questions/5677623/grails-command-object-data-binding –

Questions connexes