2009-05-05 5 views
7

Sono un noob Grails e mi imbatto in qualcosa che sembra un bug, ma è del tutto possibile che non sto configurando tutto correttamente.Lo scaffold dinamico di Grails con hasMany: si tratta di un bug o di una configurazione errata?

Ho due semplici classi di dominio:

class Player { 

     String firstName 
     String lastName 

     static constraints = { 
      firstName(blank:false) 
      lastName(blank:false) 
     } 
     String toString() { lastName + ", " + firstName } 
    } 

e

class Team { 

    String mascot; 
    static hasMany = [players:Player] 

    static constraints = { 
     mascot(blank:false) 
    } 
} 

ho controller per entrambi che non fanno nulla al di là di impalcatura dinamica queste due classi di dominio.

Ma anche quando ho un elenco di giocatori nel mio DB, non ottengo una casella di selezione multipla per loro quando si crea una nuova squadra.

Tuttavia, la selezione multipla si presenta quando vado a modificare una squadra

Si tratta di un bug nel ponteggi dinamica per i nuovi elementi, posso fraintendere come questo dovrebbe funzionare, o c'è qualcos'altro Devo dichiarare qui?

Qualsiasi aiuto è molto apprezzato! Ho degli screenshot che StackOverflow non mi permetterà di aggiungere a causa della mia novità, ma sarei felice di mostrarli in un altro modo, se ciò sarà di aiuto.

risposta

1

Sì, l'impalcatura predefinita inserisce un selettore genitore nella pagina di creazione/modifica della classe figlio.

Immagino che sia stato più semplice per loro in questo modo. Tuttavia, non dovrebbe essere una selezione multipla, ma solo una selezione singola a discesa, poiché si tratta di One-To-Many.

Come hai spiegato che volevi di più di una relazione molti-a-molti, si potrebbe provare ad aggiungere:

static hasMany = [teams:Team] 

alla classe Player. Ho scoperto che Grails funziona meglio con le relazioni bidirezionali. È anche utile avere quando si creano query di ricerca e non dovrebbe richiedere più della tabella delle relazioni di cui si aveva già bisogno.

Se si utilizza Grails pre-v1.1, le relazioni Many-to-Many non sono supportate direttamente, quindi anche l'aggiunta di hasM statico sopra non sarà la soluzione completa, come sarà necessario gestire aggiungendo all'altro elenco quando si aggiunge a una direzione. Non ho ancora usato la versione 1.1, quindi non posso parlare di ciò che è necessario per specificare il Many-to-Many in esso.

+0

Grazie per la vostra risposta Bill. Penso che forse il mio esempio potrebbe essere migliore, è che mi piacerebbe che un giocatore fosse membro di più di una squadra. È davvero più molti a molti che uno a molti. Questo è il motivo per cui non ho una proprietà sul lettore, ma ora vedo che il caso d'uso che ho scelto potrebbe aver causato confusione. La cosa strana per me è che la selezione multipla appare nella schermata Modifica come previsto, ma non nella schermata Crea. Questa incoerenza mi fa pensare che sia un bug nell'impalcatura dinamica ma non riesco a fare errori (chiaramente) – Pete

+0

Hmm, fino alla v1.1, Grails non supportava in realtà molti-a-molti, richiedendo di creare manualmente una relazione oggetto e gestisci i reciproci da solo. Non ho ancora usato la v1.1, quindi non posso commentare le sue impostazioni predefinite di impalcatura, ma il fatto che si mostri in modifica, ma non in creazione, sembra strano. Potresti provare a pubblicare sulla mailing list di Nabble Grails: http://www.nabble.com/grails---user-f11861.html – billjamesdev

+0

Ho modificato la mia risposta per prendere in considerazione il tuo aspetto Many-To-Many – billjamesdev

2

Alla fine ho capito e volevo trasmettere quello che ho fatto nel caso in cui qualcun altro vi si imbattesse.

Quando ho generato il punto di vista per il Team, il blocco di forma in edit.gsp assomiglia a questo:

<input type="hidden" name="id" value="${teamInstance?.id}" /> 
       <input type="hidden" name="version" value="${teamInstance?.version}" /> 
       <div class="dialog"> 
        <table> 
         <tbody> 

          <tr class="prop"> 
           <td valign="top" class="name"> 
            <label for="mascot">Mascot:</label> 
           </td> 
           <td valign="top" class="value ${hasErrors(bean:teamInstance,field:'mascot','errors')}"> 
            <input type="text" id="mascot" name="mascot" value="${fieldValue(bean:teamInstance,field:'mascot')}"/> 
           </td> 
          </tr> 

          <tr class="prop"> 
           <td valign="top" class="name"> 
            <label for="players">Players:</label> 
           </td> 
           <td valign="top" class="value ${hasErrors(bean:teamInstance,field:'players','errors')}"> 
            <g:select name="players" 
from="${Player.list()}" 
size="5" multiple="yes" optionKey="id" 
value="${teamInstance?.players}" /> 

           </td> 
          </tr> 

         </tbody> 
        </table> 
       </div> 
       <div class="buttons"> 
        <span class="button"><g:actionSubmit class="save" value="Update" /></span> 
        <span class="button"><g:actionSubmit class="delete" onclick="return confirm('Are you sure?');" value="Delete" /></span> 
       </div> 
      </g:form> 

ma il blocco forma in create.gsp si presenta così:

<g:form action="save" method="post" > 
       <div class="dialog"> 
        <table> 
         <tbody> 

          <tr class="prop"> 
           <td valign="top" class="name"> 
            <label for="mascot">Mascot:</label> 
           </td> 
           <td valign="top" class="value ${hasErrors(bean:teamInstance,field:'mascot','errors')}"> 
            <input type="text" id="mascot" name="mascot" value="${fieldValue(bean:teamInstance,field:'mascot')}"/> 
           </td> 
          </tr> 

         </tbody> 
        </table> 
       </div> 
       <div class="buttons"> 
        <span class="button"><input class="save" type="submit" value="Create" /></span> 
       </div> 
     </g:form> 

In altre parole, per questo caso d'angolo, la vista di creazione predefinita omette il widget per visualizzare correttamente l'elenco a selezione multipla. Quando eseguivo una copia e incolla del codice mancante, il controller con scaffolding dinamico lo raccoglieva e lo manteneva come previsto. Quindi, è sicuramente un bug nel codice di generazione della vista.

1

Ho riscontrato lo stesso problema utilizzando la versione corrente (v1.3.4) di Grails.Ho dovuto modificare manualmente il create.gsp

Problemi correlati