Доступ к модели из макета в Grails

Я использую поддержку макета (sitemesh) в Grails, который работает нормально. Я хотел бы изменить свой макет, чтобы он зависел от того, вошел ли пользователь в систему или нет.

Мой grails-app/views/layouts/main.gsp содержит следующий код:

<g:if test="${user}">
  Username: ${user.username}
</g:if>

Однако создается впечатление, что компоновщики GSP не могут получить доступ к модели и, следовательно, к пользовательской переменной (я получаю исключение "Нет сеанса" при попытке). Каков будет рекомендуемый способ сделать мой макет зависимым от того, вошел ли пользователь в систему или нет?

Заранее спасибо!

1 ответ

Решение

Я бы предложил использовать для этой цели либо запрос, либо объем сеанса. Вероятно, самый СУХОЙ способ заполнить область - это фильтр. Например, в файле grails-app/conf/SecurityFilters.groovy (вам нужно его создать):

class SecurityFilters {

    def filters = {
        populateCurrentUser(controller: '*', action: '*') {
            before = {
                 request.user = User.get(session.userId)
            }
        }
    }
}    

В этом примере предполагается, что вы сохраняете идентификатор текущего пользователя в атрибуте сеанса "userId" и что у вас есть класс домена "User". Использовать его в макете так же просто, как это:

<g:if test="${request.user}">
   Current User: ${request.user.username}
</g:if>
Другие вопросы по тегам