Мне нужен доступ к конкретной модели в моем макете main.gsp. Я искал и прочитал, что лучший способ получить это - создать фильтр после и применить модель к параметру viewModel, а затем получить к нему доступ в gsp следующим образом:
class MyFilters {
all(controller:'*', action:'*') {
after = {viewModel ->
viewModel.client = Client.get(session.clientId)
// println "Client is: ${client.toString()}"
}
}
}
А в моем GSP я должен получить "клиента" и иметь возможность получить к нему доступ?
<g:if test="${client.isPartner()}">
Do something
</g:if>
<g:else>
Do something else
</g:else>
Примером того, что я пытаюсь сделать, являются шаблоны GSP и конкретные таблицы стилей CSS, основанные на том, принадлежит ли текущий клиент, вошедший в систему, партнеру. Расположение специальных шаблонов CSS и GSP зависит от имени партнера, например:
<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 ... Однако, когда я делаю это, я получаю исключение:
ERROR grails.web.pages.GroovyPagesServlet - Original exception : Cannot invoke method isPartner() on null object
Итак, очевидно, "клиент" в GSP является нулевым. Если я раскомментирую println в фильтре после, показанном выше, он не будет нулевым в это время, и будет напечатано имя клиента. Я что-то здесь не так делаю? Есть ли лучший способ получить модель внутри main.gsp?