Как назначить переменную GSP в теле шаблона Grails ()? - PullRequest
2 голосов
/ 21 июня 2011

В моем приложении Grails 1.3.7 я хотел бы использовать шаблон, чтобы отделить окружающий HTML от представлений. Но, назначение переменных GSP не работает в содержании body (). Как я могу сделать что-то вроде следующего?

_ aTemplate.gsp:

<div class="example">
    <% out <<  body() %>
</div>

aView.gsp:

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <meta name="layout" content="main" />
</head>
<body>
    <g:set var="foo" value="${42}"/>
    <% assert foo == 42 : foo %>

    <tmpl:/aTemplate>
        <g:set var="bar" value="${6}"/>
        <% assert bar == 6 : bar %>
    </tmpl:/aTemplate>
</body>
</html> 

Назначение bar не работает: утверждение bar не выполняется, когда я получаю http://localhost:8080/myApp/aView.gsp

org.codehaus.groovy.grails.web.taglib.exceptions.GrailsTagException:
 Error executing tag<g:render>: Assertion failed:
(bar == 6). Values: bar = null
 at /Users/jbeutel/proj/grailsSandboxes/myApp/grails-app/views/aView.gsp:13 

Как сделать так, чтобы тело шаблона () работало как обычно?

В качестве альтернативы, есть ли какой-то другой способ, которым я мог бы учитывать окружающий HTML, сохраняя его сбалансированным? Мой вариант использования не на верхнем уровне, поэтому я не пробовал использовать макеты. Присвоение переменной работает, если я использую замыкание TagLib вместо файла шаблона, но я не хочу помещать много HTML в замыкание, поэтому мне все равно придется помещать несбалансированный HTML в файлы шаблона (то есть отдельные шаблоны перед и после тела). Есть ли лучший способ?

1 Ответ

1 голос
/ 20 декабря 2011

Вы можете передавать переменные из вашего .gsp в общие шаблоны, которые затем могут быть рассмотрены следующим образом. Я делаю это, чтобы скрыть ссылку «логин» в моем общем заголовке, если они находятся на странице login.gsp

<g:render template="/layouts/header" model="['hidelogin':true]"/>

затем в _header.gsp

<g:if test="${!hidelogin}">
    //show your login link
</g:if>
...