2010-07-19 3 views
0

컨트롤러를 작동하지 않음 매우 간단한 설정 컬렉션 값 :Grails를 - 버그에 대한

이, 나는 버그의 작성 방법을 알아 bugInstance.activities 인쇄되어 있으며 그 다음

def create = { 
     def bugInstance = new Bug() 
     def activity = new Activity(description:"created") 

     bugInstance.properties = params 
     bugInstance.addToActivities(activity) 
     return [bugInstance: bugInstance] 
    } 

내 활동 목적이 있었다 save 메소드를 살펴보고 똑같은 것을 인쇄했는데 결과가 null이므로 어떻게 든 내가 만든 활동을 잃어 버렸습니다. 이유는 모르겠습니다. 이것은 실제로 기본 동작입니까? 정말 간단한 기본 코드가 작동하지 않을 것 같은 이유가없는 것 같기 때문에 나는 정말 기본적인 것을 잘못하고 있습니다.

def save = { 

    def bugInstance = new Bug(params) 
    println bugInstance.activities 
    if (bugInstance.save(flush: true)) { 
     flash.message = "${message(code: 'default.created.message', args: [message(code: 'bug.label', default: 'Bug'), bugInstance.id])}" 
     redirect(action: "show", id: bugInstance.id) 
    } 
    else { 
     render(view: "create", model: [bugInstance: bugInstance]) 
    } 
} 

는 내가 저장 방법에 활동을 추가하여이 문제를 해결할 수 있습니다 알고 있지만, 할 이유가에서 활동을 잃게) (작성 ->

답변

0

바보 같은 질문처럼 들리 겠지만) (저장하지만, 숨겨진 매개 변수 또는 create.gsp에서 Bug 인스턴스가 생성시 인스턴스화 된 것을 설정하고 있습니까? 제 말은, 당신이 여기서 뭘하고 있는지 전혀 이상하지 않다고 생각합니다. create.gsp는 어떤 모습입니까?

+0

나는 필요한 모든 것을 포함했다. 내가 아는 한 최고의 코드. Grails는 예상대로 모델을 통해이 객체를 전달하지 않으며, 양식이 제출 될 때 재 작성됩니다. 하지만 여전히 내가 시도한 작업을 수행하는 방법이 있어야합니다. – walnutmon

1

당신은 새로운 인스턴스() 저장 호출하지 않습니다 : 그것은 활동 컬렉션이기 때문에이 이적으로 저장 될 것이기 때문에

def create = { 
    def bugInstance = new Bug() 
    def activity = new Activity(description:"created") 

    bugInstance.properties = params 
    bugInstance.addToActivities(activity) 
    bugInstance.save() 
    return [bugInstance: bugInstance] 
} 

당신은 활동을 저장할 필요가 없습니다.

+0

예, 지속 된 bugInstance (생성 된 ID 및 속성으로 저장 됨)를 보낸 한, 아마 작동하지만 버그는 다음과 같은 경우에 저장됩니다. 사용자가 실제로 저장을 선택할 때가 아니라 작성 페이지로 이동합니다. 그러나 이것은 save() 컨트롤러 메소드에 액티비티를 추가해야한다는 사실을 지적합니다. 포인트가 남아 있지만, 깨끗한 객체 지향적 인 방법으로 하나를 다른 것에 전달하는 방법은 무엇입니까? – walnutmon

0

자동 생성 된 create.gsp를 사용하는 경우 활동 세트가 양식에 포함되지 않습니다. 그것은 물론 모델에 있지만 클라이언트 측에서 렌더링 된 활동 필드는 없습니다. 저장하기로 돌아 왔을 때 활동이 손실 되었음이 분명합니다. 달성하려는 목표에 따라 createChsp에 활동 선택기를 추가하거나 활동 설명과 함께 숨겨진 필드를 추가 할 수 있지만 저장 조치에서 활동 매개 변수를 처리해야합니다. 경우, grails의 마술은 당신을 위해 활동을 instanciating까지 이동하지 않습니다. 저장 작업에서 Bug 자체를 인스턴스화하는 것과 같은 방식으로, 지속성을 유지하려면 활동을 인스턴스화하고 저장해야합니다.

편집 : 실제로 전체 활동 목록을 전달하려는 경우 색인 된 속성을 사용할 수 있습니다.

<g:each status="i" var="activity" in="${bugInstance.activities}"> 
    <!-- one hidden field for each property of each attached activity --> 
    <g:hiddenField 
    name="activities[${i}].description" 
    value="${activity.description}" /> 
</g:each> 

을 그리고 저장 방법이에 :

create.gsp에서이 추가

params.activities.each{ activity -> 
    bugInstance.addToActivities(new Activity(activity)) 
} 

그러나 귀하의 경우는 하나의 필드에서 하나 개의 활동을 인스턴스화하기에 충분 될 수 있습니다.

관련 문제