2009-05-05 17 views
7

Ben bir Grails noob'um ve bir hata gibi görünen bir şeye koşuyorum, ancak tamamen doğru bir şekilde yapılandırmıyorum.HasMany ile Grails dinamik iskele: bir hata mı yoksa yanlış mı yapıyorum?

class Player { 

     String firstName 
     String lastName 

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

ve

class Team { 

    String mascot; 
    static hasMany = [players:Player] 

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

Dinamik iskele bu iki Alan Sınıfları ötesinde hiçbir şey ikisi için denetleyicileri var

:

Ben iki basit Alan Sınıfları var.

Ancak, DB'mizde bir Oyuncular listesi olsa bile, yeni bir Ekip oluştururken bunlar için çoklu seçim kutusu alamıyorum. Bir Takımı

düzenlemek için gittiğinizde

Ancak çoklu seçim ben olacak bu iş, ya da orada başka bir şey nasıl yanlış mı, bu yeni öğeler için dinamik iskele bir hata mı gösterir Buraya bildirmem mi gerekiyor?

Her türlü yardım büyük beğeni topluyor! StackOverflow'un benim yeniliğimden dolayı eklememe izin vermeyeceği ekran görüntüleri var, ama eğer yardımcı olacaksa onlara başka bir şekilde göstermekten mutluluk duyarım.

cevap

1

Evet, varsayılan yapı iskelesi, 'oluştur/düzenle sayfasının alt sınıfında bir üst seçiciyi koyar.

Sanırım bu şekilde onlar için daha kolaydı. Çoktan seçmeli olmamalı, sadece bir çek-aşağı tek seçmeli, Bir-bir-Çok. Eğer bir çok-Birçok ilişkinin daha istedi açıkladığımız gibi

, sen eklemeyi deneyebilirsiniz:

static hasMany = [teams:Team] 

sizin Oyuncu sınıfına. Grails'in çift yönlü ilişkiler ile daha iyi olduğunu anladım. Ayrıca, arama sorguları oluştururken sahip olmanız ve ihtiyacınız olan tek ilişki tablosundan daha fazlasını gerektirmemesi de yararlıdır.

Grails pre-v1.1 kullanıyorsanız, Çoktan çoğa ilişkiler doğrudan desteklenmez; bu nedenle, statik hasMany'in eklenmesi bile, yönetmeniz gerekeceğinden tam çözüm olmayacaktır. Bir yöne eklediğinizde diğer listeye ekleyerek. Henüz v1.1 kullanmadım, bu yüzden İçinde Çoktan-çoğunu belirtmek için gerekli olan şey hakkında konuşamam.

+0

el ile değiştirmek zorunda kaldı. Belki de örneğimin daha iyi olabileceğini düşünüyorum, bir Oyuncunun birden fazla Takım üyesi olmasını istiyorum. Bu gerçekten bire-birden çokdan çoğa var. Bu yüzden Oyuncuya ait değilim, ama şimdi seçtiğim kullanım durumunun karışıklığa neden olabileceğini görüyorum. Benim için garip olan şey, çoklu seçimin Düzenleme ekranında beklenen şekilde değil, Oluştur ekranında görünmesidir. Bu tutarsızlık beni dinamik bir iskelede bir hata olduğunu düşünmemi sağlıyor ancak hata yapmaktan çok öteye gidiyorum (açıkça) – Pete

+0

Hmm, v1.1'e kadar, Grails çoktan çoğa desteklemiyordu, el ile bir ilişki oluşturmanızı gerektiriyordu Karşılıklı itirazları kendiniz yapın ve yönetin. Henüz v1.1 kullanmadım, bu yüzden iskele varsayılanlarına yorum yapamıyorum, ama düzenleme üzerinde gösterdiği ama yaratmadığı gerçeği balık gibi görünmüyor. Http://www.nabble.com/grails---user-f11861.html – billjamesdev

+0

Nabble'ın Grails e-posta listesinde yayınlamayı deneyebilirsiniz. Çok-çok-fasetinizi hesaba katmak için cevabımı düzenledim – billjamesdev

2

Sonunda bunu anladım ve başka birinin içine girmesi durumunda yaptığım şeyden geçmek istedim. Ben Takım için çok görüntülemeye zaman

, edit.gsp form blok şuna benzer:

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

ama create.gsp form blok şuna benzer:

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

yılında Başka bir deyişle, bu köşe durumu için varsayılan Oluştur görünümü, çoklu seçim listesini düzgün bir şekilde görüntülemek için widget'ı devre dışı bırakır. Kayıp kodun bir kopyasını ve yapıştırmasını yaptığımda, dinamik olarak skafoldlu kontrol cihazı onu aldım ve beklendiği gibi ısrar etti. Yani, kesinlikle görünüm oluşturma kodunda bir hata.

1

Aynı problemle Grails'in geçerli sürümü (v1.3.4) kullanılarak karşılaştım.Create.gsp'yi

İlgili konular