2011-01-17 2 views
2

main.gsp 레이아웃의 특정 모델에 액세스해야합니다. 나는Grails : main.gsp 레이아웃의 모델 액세스

class MyFilters { 
    all(controller:'*', action:'*') { 
     after = {viewModel -> 
      viewModel.client = Client.get(session.clientId) 
      // println "Client is: ${client.toString()}" 
     } 
    } 
} 

을 그리고 내 GSP에 : 나는 주위 검색이를 얻을 수있는 가장 좋은 방법은 필터 후를 작성하고 뷰 모델의 PARAM에 모델을 적용하고 그래서 같이 GSP에 액세스하는 것을 읽고 "클라이언트"가 있어야하고 액세스 할 수 있어야합니까?

<g:if test="${client.isPartner()}"> 
    Do something 
</g:if> 
<g:else> 
    Do something else 
</g:else> 

내가 할 노력하고있어의 예

는 GSP 템플릿을 포함하고 로그인 한 현재 클라이언트 파트너에 속하는 경우에 따라 특정 CSS 스타일 시트를 포함한다. 나는이 작업을 수행 할 때마다

<g:if test="${client.isPartner()}"> 
    <link rel="stylesheet" type="text/css" href="/partners/${client.getPartner().toString()}/css/style.css"/> 
</g:if> 
<g:else> 
    <link rel="stylesheet" type="text/css" href="/partners/default/css/style.css"/> 
</g:else> 

이것은 또한, 그러나 ... GSP 템플릿을 함께 할 것, 내가의 예외가 : 예를 들어, 그래서 특별한 CSS 및 GSP 템플릿의 위치는 파트너의 이름에 따라 달라집니다

ERROR grails.web.pages.GroovyPagesServlet - Original exception : Cannot invoke method isPartner() on null object 

분명히 "클라이언트"는 GSP에서 null입니다. 위에 표시된 필터에서 println의 주석을 제거하면 현재 null이 아니며 클라이언트 이름이 인쇄됩니다. 내가 여기서 뭔가 잘못하고있는거야? main.gsp 내부의 모델을 얻는 더 좋은 방법이 있습니까?

답변

3

최근에 제가 물었던 질문이 중복 된 것 같습니다. 나는 태그 라이브러리와 함께이 문제를 해결하는 것을 제안 :

... 
static namespace = "yournamespace" 
... 
def partnerDetails = { attrs, body -> 
    def client = Client.get(session.clientId) 
    if (client.isPartner()) { 
     out << "Whatever you want to write out..." 
        // You can also call other tag libs from here - see docs 
    } 
    } 
... 

그런 다음 사용

How do I (or should I?) access the service layer from a SiteMesh template (views/layouts/main.gsp) in Grails?

당신은 너무 이런 비트한다고 폐쇄가 작동, 태그 lib 디렉토리에서 세션에 액세스 할 수 이처럼 GSP 뭔가 태그 : 또한 attrs지도를 통해 폐쇄로 전달되어,의 속성을 전달할 수 있습니다

<yournamespace:partnerDetails /> 

, 난 f는 도움이됩니다. 조건부 태그의 몸을 렌더링 할 경우

마지막으로, 당신은 같은 것을 수행 할 수 있습니다

... 
if (client.isPartner()) { 
    out << body() 
} 
.... 

을 그리고 당신은 이런 식으로 부를 것이다 :

<yournamespace:partnerDetails> 
    This is the body content that will be output in the body() call above. 
</yournamespace:partnerDetails> 
+0

이 나를 위해 작동하지 않습니다. isPartner() 메서드는 hasMany 관계 인 모델의 일부를 액세스하기 때문에 지연 초기화에 대해 다른 오류가 발생합니다. 왜 이런 일이 일어나는지 ...그러나 isPartner() 메서드 이외의 다른 메서드를 사용하기 때문에 클라이언트 개체가 필요합니다. 예를 들어 파트너에게도 액세스 권한이 필요합니다. 어쨌든 고마워! – intargc

+0

taglib로이 문제를 해결해야합니다. 많은 로직을 뷰로 끌어 들이면 MVC 개념을 위반하게됩니다. 어쩌면 당신이 시도한 taglib의 코드를 게시하고 사람들이 도움을 줄 수 있다면 가장 쉽다. – david

+0

사실, 깨끗한 후에는 taglib에서 잘 작동한다. 그러나 if/else는 그 조건에 기반하여 일부 CSS를 렌더링하고, 특정 지역의 CSS에서 얻으려면 파트너 ID가 필요하기 때문에 isPartner() 메소드에 대한 액세스가 필요하기 때문에 의미가 있습니까? ... ...와 같은 태그가 있어야합니다. 그 태그의 본문 부분에 클라이언트 개체에 액세스 할 줄 것이라고 ...하지만 좋은 또는 나쁜 것으로 간주됩니다? – intargc

1

그 필터를 컨트롤러를 통과하는 요청 만 일치시킵니다. UrlMappings.groovy의보기로 직접 라우팅하는 경우 조회가 발생하지 않습니다. 컨트롤러를 통해 라우팅하는지 여부에 관계없이 URL을 필터링하려면 다음과 같이하십시오.

class MyFilters { 
    all(uri: "/**") { 
     ... 
    } 
} 
+0

불행히도이 작업은 작동하지 않습니다 ... 동일한 오류가 발생합니다. 그러나 실제로 테스트 할 페이지의 컨트롤러를 통해 진행됩니다. main.gsp에 있어야하기 때문에 모든 페이지에서 사용할 수 있어야합니다. – intargc

+0

네임 스페이스 문제 일 수 있습니다. '$ {pageScope.getProperty ('client')}'는 GSP에서 무엇인가 평가합니까? – ataylor

+0

이상하게도 GSP에서 인쇄 할 경우 클라이언트 객체의 toString()을 얻습니다. 내가 기대하는 바는 무엇인가. 그러나이 예외가 발생합니다. [5] 라인의 표현식 [pageScope.getProperty ('client')]을 평가하는 중 오류가 발생했습니다. 해당 속성 없음 : 클래스 org.codehaus.groovy.grails.web.pages.GroovyPageBinding의 클라이언트 – intargc

1

나는 태그 라이브러리 다음 생성 제안 :

<g:ifPartner id="123">This client is a partner</g:ifPartner> 

해당 코드는 다음과 같을 것이다 :

def isPartner = { attrs, body -> 

    def id = attrs.remove('id') 
    if (Client.get(id)?.isPartner()) { 
    out << body() 
    } 
}