Доступ к модели из макета в Grails - PullRequest
5 голосов
/ 02 февраля 2009

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

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

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

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

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

1 Ответ

9 голосов
/ 02 февраля 2009

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

class SecurityFilters {

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

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

<g:if test="${request.user}">
   Current User: ${request.user.username}
</g:if>
...