Это не работает, потому что вы просто вызываете рендер со строкой.
Макет применяется, когда вызывается фильтр sitemesh.Чтобы это работало, вам нужно применить декораторы sitemesh к вашей строке.
Когда мы создавали подобную функцию, все, что мы делали, это отправляли соответствующие фрагменты страницы:
, т.е.
Mytemplate.gsp
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<meta name="layout" content="${layout}"/>
${head}
</head>
<body>
${body}
</body>
</html>
и тогда вы можете просто позвонить:
render( template: 'MyTemplate', model:[ layout: 'layout', head: '...', body: '...' ] )
Это имеет тот же эффект, что вы пытаетесь сделать, но с добавлением sitemesh (и, возможно, плагинов, интегрирующихся правильно).