Получение доменных переменных на макете - PullRequest
0 голосов
/ 16 декабря 2011

Как лучше всего передать переменные модели в макет в Grails?В частности, я использую плагин безопасности Spring, который имеет класс User.У меня также есть класс Contact, который выглядит следующим образом:

class Contact {

    String realname
    String company
    String mobile
    String fix
    String email
    User user
        ...

Какие есть варианты для получения информации о компании, зарегистрированной в данный момент в моем макете (main.gsp)?

Ответы [ 3 ]

1 голос
/ 16 декабря 2011

Чтобы добавить к ответу выше, вы могли бы альтернативно установить переменную сеанса для пользователя при входе в любой вызываемый метод контроллера.

Вы также можете просто установить переменную сеанса для компании в методе контроллера:

session.company = Contact.findByUser(session.user)?.company

или из приведенного выше примера

   session.company = Contact.findByUser(SecurityContextHolder.context.authentication?.principal)?.company

А в вашем main.gsp что-то вроде:

<span id="companyName">${session.company}</span>
1 голос
/ 16 декабря 2011

Вы имеете в виду, что вам нужно передавать эту модель для каждой страницы автоматически вместо ручной передачи при рендеринге на каждом контроллере?Вы можете использовать фильтры там:

def filters = {
    all(controller: '*', action: '*') {
        before = {
            request.setAttribute('loggedInPerson', SecurityContextHolder.context.authentication?.principal)
            //Notice, that there is used original Authentication, from Spring Security
            //If you need you can load your Contact object there, or something
        }
        after = {

        }
        afterView = {

        }
    }
}

и использовать loggedInPerson в вашем gsp:

Hello ${loggedInPerson.username}!

Кстати, есть также Spring Security tags, который может помочь вам без использования вашего собственного фильтра, например:

Hello <sec:loggedInUserInfo field="username"/>!
0 голосов
/ 17 декабря 2011

Если вы хотите добавить определенный объект в модель, вы также можете использовать «перехватчики», предоставляемые Grails.Чтобы добавить определенную переменную в конкретный контроллер, вы можете использовать что-то вроде этого.

def afterInterceptor = {model, modelAndView->

    model.loggedInUser = getLoggedInUser()  // retrieve your user details here

}

И вы можете извлечь loggedInUser в макете main.gsp как ${loggedInUser}.

Если вам нужно получить эти данные в нескольких контроллерах, вы можете создать BaseController и оставить afterInterceptor в этом BaseController.Все контроллеры, которым необходима ссылка на вошедшего в систему пользователя в соответствующих представлениях, должны расширять BaseController.

...