2009-05-05 13 views
7

Soy un novato de Grails y me encuentro con algo que parece ser un error, pero es muy posible que no esté configurando todo correctamente.Grails andamio dinámico con hasMany: ¿es un error o estoy configurando incorrectamente?

Tengo dos clases de dominio simples:

class Player { 

     String firstName 
     String lastName 

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

y

class Team { 

    String mascot; 
    static hasMany = [players:Player] 

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

tengo los controladores para ambos que no hacen nada más allá de andamio dinámica de estas dos clases de dominio.

Pero incluso cuando tengo una lista de jugadores en mi base de datos, no obtengo un cuadro de selección múltiple para ellos al crear un nuevo equipo.

Sin embargo, la selección múltiple aparece cuando voy a editar un equipo

Es esto un error en el andamiaje dinámico de nuevos artículos, no me malinterpreten cómo se supone que funciona, o hay alguna otra cosa Necesito declarar aquí?

¡Cualquier ayuda es muy apreciada! Tengo capturas de pantalla que StackOverflow no me permitirá agregar debido a mi novedad, pero estaría encantado de mostrarles otra forma si eso ayuda.

Respuesta

1

Sí, el andamio predeterminado coloca un selector principal en la página de creación/edición de la clase secundaria.

Supongo que fue más fácil para ellos de esta manera. Sin embargo, no debería ser una selección múltiple, solo una selección individual desplegable, ya que es uno a muchos.

Como se ha explicado que quería más de una relación de varios a varios, es posible que trate de añadir:

static hasMany = [teams:Team] 

a su clase de jugador. Descubrí que a Grails le va mejor con las relaciones bidireccionales. También es útil para crear consultas de búsqueda, y no debería requerir más de una tabla de relaciones que ya necesitaría.

Si está utilizando Grails pre-v1.1, las relaciones Muchos a Muchos no son compatibles directamente, por lo que incluso agregar el hasMático estático arriba mencionado no será la solución completa, ya que tendrá que administrar agregar a la otra lista cuando agrega a una dirección. Todavía no he usado v1.1, así que no puedo hablar sobre lo que se necesita para especificar Many-to-Many en él.

+0

Gracias por su respuesta Bill. Creo que quizás mi ejemplo podría ser mejor, es que me gustaría que un jugador sea miembro de más de un equipo. Realmente es más de muchos a muchos que de uno a muchos. Es por eso que no tengo un belongsTo en el reproductor, pero ahora veo que el caso de uso que elegí podría haber causado confusión. Lo que me resulta extraño es que la selección múltiple aparece en la pantalla Editar como se esperaba, pero no en la pantalla Crear. Esa inconsistencia me hace pensar que es un error en el andamiaje dinámico, pero estoy más allá de cometer errores (claramente) – Pete

+0

Hmm, hasta v1.1, Grails en realidad no era compatible con Many-to-Many, requiriendo que crearas manualmente una relación objeta y administra los reciprocals tú mismo. Todavía no he usado v1.1, así que no puedo comentar sobre sus valores predeterminados de andamios, pero el hecho de que se muestre en edición, pero no en creación, parece sospechoso. Puede intentar publicar en la lista de correos electrónicos de Nabble's Grails: http://www.nabble.com/grails---user-f11861.html – billjamesdev

+0

He editado mi respuesta para tener en cuenta su faceta de muchos a muchos – billjamesdev

2

Finalmente me di cuenta de esto y quería transmitir lo que hice, solo en caso de que alguien más se encuentre con él.

Cuando me genera los puntos de vista de equipo, el bloque de la forma en edit.gsp se parece a esto:

<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> 

pero el bloque en forma create.gsp se ve así:

<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> 

En es decir, para este caso de esquina, la vista Crear predeterminada omite el widget para mostrar correctamente la lista de selección múltiple. Cuando hice una copia y pegué el código faltante, el controlador dinámicamente con scaffolded lo recogió y lo persistió como se esperaba. Entonces, definitivamente es un error en el código de generación de vista.

1

Tuve el mismo problema al utilizar la versión actual (v1.3.4) de Grails.Tuvo que modificar manualmente el create.gsp

Cuestiones relacionadas