Мне нужен доступ к определенной модели в макете main.gsp. Я искал вокруг и прочитал, что лучший способ, чтобы получить это, чтобы создать после фильтра и применить модель к парам ViewModel, а затем получить доступ к нему в GSP так:Grails: доступ к модели в макете main.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 в указанном выше фильтре after, он не является нулевым в это время и будет напечатано имя клиента. Я здесь что-то не так? Есть ли лучший способ получить модель внутри main.gsp?
Это не похоже на работу для меня. Я получаю другую ошибку относительно ленивой инициализации, потому что метод isPartner() обращается к части модели, которая является отношением hasMany. Не знаю, почему это происходит ...Тем не менее, я бы предпочел просто иметь клиентский объект, потому что из него есть несколько методов, кроме метода isPartner(). Например, мне также нужен доступ к партнерам. Спасибо, в любом случае! – intargc
Вы действительно должны подумать о решении этого с помощью taglib. Притяжение к большей логике в представлении нарушает концепцию MVC. Может быть, это проще всего, если вы публикуете код taglib, который вы пробовали, и люди могут помочь. – david
Собственно, после чистки он отлично работает в taglib. Однако, поскольку мне действительно нужен доступ к этому методу isPartner(), потому что у меня есть if/else, чтобы отображать некоторые CSS на основе этого условия, а затем требуется идентификатор партнеров, чтобы получить CSS в определенной области, было бы разумно имеют тег типа ... ... mytag: client>? Это даст мне доступ к объекту клиента в основной части этого тега ... Но считается ли это хорошим или плохим? –
intargc