2012-02-07 2 views
3

내 질문은 포스트 Render a view of another controllerGrails는

나는 TestConfigController 내 질문이 나는 경우 유효성 검사에서 할 수있는 것은 실패 무엇을하고 난 컨트롤러를 렌더링 할 다음이 유사하다 다른 컨트롤러의 뷰를 렌더링 보다는 컨트롤러 : testCOnfig 및보기 : 편집

def save() { 

     def testConfigInstance = new TestConfig(params) 
     if (!testConfigInstance.save(flush: true)) { 

/* 오히려 다음보기 : "편집"내가보기 원하는 : 작동하지 않습니다 "/ 테스트/편집"*/

  render(view:"edit", model: [testConfigInstance: testConfigInstance],id:params.test.id) 
      return 
     } 
     println "+++++++++++++++++++++++++" 
     flash.message = message(code: 'Data successfully saved', args: [message(code: 'testConfig.label', default: 'Successfully saved')]) 
     redirect(action: "edit", controller:"test", id:params.test.id) 
    } 

모든 포인터? 나는 이미 grails redirect에 "model"매개 변수가 없으므로 뷰에 유효성 검사 오류를 전달할 수 없습니다. 에는 다른 컨트롤러로 돌아갈 수 있도록 컨트롤러 매개 변수가 없습니다. 자세한 내용/코드는 두 가지

render(view:"/test/edit", model: [testConfigInstance: testConfigInstance],id:params['test.id']) 

위의 코드에 대한 참조가있는 페이지/테스트/편집을 렌더링 중 하나를 사용하는 동안 발생하는 다음

편집 를 필요한 경우 알려 주시기 바랍니다 testid를 결국 "test.id는"null이 될 수 없다는 밖으로 erroring .. (그 렌더링/테스트/편집을 의미하지/테스트/편집/1)

render(view:"/test/edit/"+params['test.id'], model: [testConfigInstance: testConfigInstance],id:params['test.id']) 
위의 코드는 다음과 같은 리드

ERR 또는 위의 코드의

The requested resource (/EasyTha/WEB-INF/grails-app/views/test/edit/1.jsp) is not available. 

어느 하나 그냥 "/ 테스트/편집"마지막에 아이디, 따라서 결국 test.id가 null이 될 수 없다는 밖으로 erroring를 렌더링합니다.

+2

에 볼 수있는 전망을 폐쇄 렌더링 "/ 테스트/편집"작업해야 그것을 통과해야합니다. 어떤 grails 버전을 사용하고 있습니까? –

+1

"작동하지 않는다"에 대한 자세한 정보를 제공해 주실 수 있습니까? 오류 메시지가 나타 납니까? 그것은 작동해야합니다. –

+0

@AnujArora Grails 2.0. 지금은 작동하지만 지금은 개발 컨텍스트로 인해 작동하지 않을 수도 있다는 생각이 들었습니다./context/test/edit 시도해야 할 수도 있습니다 – Sap

답변

7

뷰 경로에 추가하려고하는 id 값은 모델 맵의 일부 여야합니다. 모델 맵에서 제공 한 값은 렌더링 된 뷰에서 사용할 수 있습니다.

첫 번째 옵션에서 id 매개 변수는 render 메소드가 'id'매개 변수를 사용하지 않으므로 아무런 차이가 없습니다. redirect 메소드는 id 매개 변수를 사용하여 리디렉션 URL을 생성합니다. 당신이 어떤 다른 조치로 리디렉션하지 않습니다 여기에 사용하는

render(view:"/test/edit", model: [testConfigInstance: testConfigInstance, id:params['test.id']]) 

렌더 방법 :

귀하의 코드는 다음과 같이해야한다. render는 구문 분석 된 viewName을 출력 스트림에 출력합니다. 예 : render (view : "/ test/edit")는 edit.gsp 뷰를 렌더링합니다. 실제로 테스트 컨트롤러의 편집 작업으로 리디렉션하지 않습니다. 따라서 모델지도에서 id를 전달해도 view의 testInstance에 액세스 할 수는 없습니다. 당신은 ID로 testInstance을 얻고 모델지도

render(view:"/test/edit", model: [testConfigInstance: testConfigInstance, testInstance: Test.get(params['test.id'] as Long)]) 
+0

이 솔루션은 테스트/편집 및 ID에 대한 참조가없는 웹 페이지 렌더링을 작동하지 않는 것 같습니다. 내 직감은 테스트/편집으로 리디렉션하는 동안 모델에 testConfig 인스턴스가 있다는 것입니다. ? – Sap

+0

id는/test/edit 뷰에서 모델 매개 변수로 사용할 수 있어야합니다. 여기에 gsp를 게시 할 수 있습니까? –

+0

너무 큰 GSP를 여기에 붙여 넣으세요. 괜찮 으면 다운로드 할 수 있습니까? http://cynosuredev.com/edit.rar – Sap

5

아누 즈 아 로라은 맞다 :

당신은 당신은 관례에 따라 grails-app/폴더보기와 관련된 뷰의 전체 경로를 사용할 수있는 임의의 뷰 렌더링하려면 : 귀하의 경우

을 :

render(view:"/test/edit", model: [testConfigInstance: testConfigInstance],id:params.test.id) 

이 작동해야합니다.

1

/test/edit보기 만 렌더링하려는 경우 render(view:'/test/edit',...) 호출 만 있으면됩니다.

대신, TestControlleredit 작업의 처리 중 일부를 포함하려면 chain() 호출을 확인하십시오. 여기에는 유효성 검사 오류를 전달할 수있는 model 매개 변수와 controller/action 매개 변수가있어 다른 컨트롤러로 리디렉션됩니다.

+0

'chain()'호출의 con는 클라이언트에 리디렉션이 전송된다는 것입니다. 이로 인해 애플리케이션에 오버 헤드가 추가됩니다. 이 경우 [include()] (http://grails.org/doc/latest/ref/Tags/include.html) 호출을 선호합니다. – Peter

+0

사실, 당신은'g.include()'호출의 결과를 렌더링하고 리다이렉트 오버 헤드를 저장할 수 있습니다. 그 옵션을 한번도 고려해 보지 않았습니다. – schmolly159

+0

안녕 체인은 완벽하게 작동하지만 테스트에 많은 testconfig가있는 시나리오에서 어떻게 작업을 포함 시킬지 궁금합니다. 테스트/편집/테스트에서 모든 testconfig를 보여줍니다. – Sap