2010-01-23 5 views
1

J'ai un objet composite de domaine comme suit:Comment enregistrer une valeur de champ composite dans Grails GSP?

class Person 
{ 
    static embedded = ['forSale'] 
    Boolean isSelling 
    House forSale 
} 

class House 
{ 
    Integer numBedrooms 
} 

J'ai un contrôle de sélection pour les numBedrooms comme suit:

<tr class="prop"> 
<td valign="top" class="name"> 
    <label for="numBedrooms"><g:message code="person.numBedrooms.label" default="Num Bedrooms" /></label> 
</td> 
<td valign="top" class="value ${hasErrors(bean: personInstance, field: 'forSale.numBedrooms', 'errors')}"> 
    <g:select name="numBedrooms" value="${fieldValue(bean: personInstance, field: 'forSale.numBedrooms')}" 
      noSelection="${['null':'Select a number...']}" 
     from="${1..6}" 
    /> 
</td> 
</tr> 

Notez que j'utilise forSale.numBedrooms dans le fieldValue sur la sélection . Je n'ai pas pu produire de code échafaudé pour que cela prenne en compte la façon dont il est supposé être fait car la vue de création générée par create-views ne contient aucune référence aux champs de l'objet forSale House.

Je n'ai pas non plus été capable d'afficher les exampes de champs composites accédés via GSP, donc c'est un peu une conjecture. Dans tous les cas, la page GSP s'affiche sans erreur, bien que cela puisse être dû au fait que je n'ai pu enregistrer aucune donnée.

j'envoie la valeur de numBedrooms retour dans le cadre d'une chaîne de requête URl ...

& numBedrooms = 2

Quand je fais le code enregistrer dans mon contrôleur est défaillant en silence - au moins rien jamais écrit dans la base de données. J'ai activé la journalisation du débogage pour à peu près tout, mais je ne reçois aucun message dans le journal qui suggère que quelque chose ne va pas, bien que quelque chose soit évident.

Si je supprime le paramètre numBedrooms de la chaîne de requête, alors ma sauvegarde se déroule comme d'habitude, donc je suppose que c'est quelque chose à voir avec la résolution de numBedrooms.

Une idée de ce que je fais mal et ce que je peux faire pour dépister mon problème?

Répondre

0

Ce que je fais est generate-all pour le domaine House puis copiez et collez le code GSP et retirez les fichiers une fois que j'ai terminé. J'ai également trouvé plus intelligent de créer des modèles pour éditer le domaine House dans le cas où j'utilise le domaine House plus tard.

Pour vous GSP dont vous avez besoin quelque chose comme ceci (Notez l'attribut name)

<tr class="prop"> 
<td valign="top" class="name"> 
    <label for="forSale.numBedrooms"><g:message code="house.numBedrooms.label" default="Num Bedrooms" /></label> 
</td> 
<td valign="top" class="value ${hasErrors(bean: personInstance.forSale, field: 'numBedrooms', 'errors')}"> 
    <g:select name="forSale.numBedrooms" value="${fieldValue(bean: personInstance.forSale, field: 'numBedrooms')}" 
      noSelection="${['null':'Select a number...']}" 
     from="${1..6}" 
    /> 
</td> 
</tr> 

Dans votre chaîne de param dont vous avez besoin *forSale*.numBedrooms=2. ce code fonctionnera avec person.properties = params ou new Person(params).

L'instruction "intégrée" indique seulement à Hibernate d'inclure les paramètres dans le même tableau que les classes de domaine séparées. Il va probablement générer une table pour le domaine même si vous ne pouvez jamais l'utiliser.

Hope this helps.

+0

Si vous vérifiez mon code, vous verrez que j'utilise forSale.numBedrooms et j'ai changé le paramètre url pour y faire référence également. Quand je vérifie ce qui se passe sur les paramètres d'URL, mes champs forSale sont regroupés dans un objet. De plus, j'assigne en utilisant l'assignation de params aux propriétés comme vous le suggérez. Le problème est que mes lignes de table ne sont pas mises à jour. Quelque chose dans la pile, que ce soit des grails ou des hibernates, échoue silencieusement. J'ai la journalisation de débogage activée pour tout et un fichier journal de 128 Mo et aucun message indiquant que la mise à jour a échoué. Je n'ai aucune idée de ce qui se passe. – Simon

+0

Votre code a vous avez besoin de code comme

Questions connexes