2009-05-05 10 views
7

나는 Grails 멍청이이고 버그 인 것처럼 보이지만 실제로는 모든 것을 올바르게 구성하지 않을 수도 있습니다.hasMany가있는 Grails 동적 스캐 폴드 : 버그입니까, 잘못 설정 했습니까?

class Player { 

     String firstName 
     String lastName 

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

class Team { 

    String mascot; 
    static hasMany = [players:Player] 

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

내가 동적 발판이 두 도메인 클래스 이상 아무것도하지 않는 모두를위한 컨트롤러가

:

나는 두 가지 간단한 도메인 클래스를 가지고있다.

하지만 내 DB에 플레이어 목록이 있어도 새 팀을 만들 때 다중 선택 상자가 표시되지 않습니다. 나는 팀

을 편집 갈 때

그러나, 다중 선택은 내가이이 일을 가정, 또는 거기는 뭔가 다른 방법을 오해 할이 새 항목에 대한 동적 비계의 버그가 나타난다 여기서 선언해야합니까?

도움을 주시면 대단히 감사하겠습니다! StackOverflow가 새로 추가 되었기 때문에 추가하지 못하게하는 스크린 샷이 있지만 도움이된다면 다른 방법으로 보여 주면 기쁩니다.

답변

1

예, 기본 스캐 폴딩은 하위 클래스의 '만들기/수정'페이지에 상위 선택자를 넣습니다.

나는 이런 식으로 생각하기가 더 쉽다고 생각합니다. 그것은 일대 다 (One-to-Many)이기 때문에 다중 선택이 아니라 단일 선택 풀다운 일 것입니다. 당신은 당신이 다 대다 관계의 더 원 설명했듯이

, 당신은 추가 시도 할 수 있습니다 :

static hasMany = [teams:Team] 

당신의 플레이어 클래스에. 나는 Grails가 양방향 관계에서 더 잘된다는 것을 발견했다. 검색 쿼리를 작성할 때 유용하며 이미 필요한 관계 테이블 하나 이상을 요구하지 않아야합니다.

Grails pre-v1.1을 사용하는 경우에는 다 대다 관계가 직접적으로 지원되지 않으므로 위의 정적 hasMany를 추가한다고해도 완벽한 솔루션이 될 수는 없습니다. 한 방향에 추가 할 때 다른 목록에 추가됩니다. 저는 아직 v1.1을 사용하지 않았기 때문에 Many-to-Many를 지정하는 데 필요한 것이 무엇인지 이야기 할 수는 없습니다.

+0

답장을 보내 주셔서 감사합니다. 필자는 예제가 더 좋을 수 있다고 생각합니다. 플레이어가 둘 이상의 팀 구성원이되기를 바랍니다. 일대 다 방식보다 실제로는 다 대 다다형입니다. 이것이 내가 Player에 belongsTo가없는 이유이지만, 내가 선택한 유스 케이스가 혼란을 야기 할 수 있음을 알게되었습니다. 나에게 이상한 점은 편집 화면에서 멀티 선택이 예상대로 나타나지만 Create 화면에서는 나타나지 않는다는 것입니다. 그 불일치로 인해 동적 인 스캐 폴딩의 버그라고 생각하게된다. (실수로) 실수를하기가 거의 없다. – Pete

+0

흠, v1.1까지, Grails는 실제로 many-to-many를 지원하지 않았기 때문에 수동으로 관계를 만들어야했다. 객체를 만들고 자신을 상호 관리하십시오. 나는 아직 v1.1을 사용하지 않았기 때문에 스캐 폴딩 기본값에 대해서는 언급 할 수는 없지만, 편집 할 때 보여 주지만 만들지는 않는다는 사실은 비참한 것처럼 보입니다. Nabble의 Grails 전자 메일 목록에 게시하려고 시도 할 수 있습니다. http://www.nabble.com/grails---user-f11861.html – billjamesdev

+0

Many to Many 패싯을 고려하여 내 응답을 편집했습니다. – billjamesdev

2

나는 마침내 이것을 알아 냈고, 다른 누군가가 그것에 빠져들 경우에 대비하여 내가 한 일을 전하려고했다. 내가 팀에 대한 뷰를 생성 할 때

는 edit.gsp에서 양식 블록은 다음과 같습니다

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

하지만 create.gsp에서 양식 블록은 다음과 같습니다

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

에서 즉,이 코너의 경우 기본 작성보기는 위젯을 생략하여 다중 선택 목록을 올바르게 표시합니다. 누락 된 코드를 복사하여 붙여 넣을 때 동적으로 스캐 폴딩 된 컨트롤러가 코드를 선택하여 예상대로 유지했습니다. 따라서 뷰 생성 코드의 버그입니다.

1

Grails의 최신 버전 (v1.3.4)을 사용하여 동일한 문제가 발생했습니다.수동으로 create.gsp를 수정해야했습니다.

관련 문제