Лучший способ передать объекты между действиями контроллера в Grails - PullRequest
3 голосов
/ 17 марта 2012

Я хочу, чтобы ссылка открывала другое представление в моем веб-приложении для отображения информации об указанном объекте. Как лучше всего передавать объекты между действиями контроллеров в граале?

Ответы [ 3 ]

4 голосов
/ 17 марта 2012

Действия могут быть объединены в цепочку с использованием метода контроллера цепи .

Цепочка позволяет сохранить модель от одного действия к следующему.

0 голосов
/ 29 марта 2017

Предыдущие ответы неполные. Итак, я собираю их вместе со своими данными и проясняю их.

У вас есть два варианта:

  1. Цепочка действий:

    def action1() = {
        DomainClass domainInstance = DomainClass.findById(params.id);
        chain (action: 'action2', model: [domainInstance: domainInstance]); 
    }
    
    def action2() = {
        DomainClass domainInstance = chainModel?.domainInstance ?: DomainClass.findById(params.id);
        [domainInstance: domainInstance]; 
    }
    

    Однако, похоже, что последующее действие использует новый сеанс базы данных вместо того, чтобы повторно использовать тот из предшественника (который также может быть настраивается в Grails, хотя я не знаю как). Так что лениво загруженный объект не может быть полностью загружен в последующем действии и может дать LazyInitializationException (в зависимости от вашей конфигурации ORM, конечно).

  2. Пересылка запроса:

    def action1() = {
        DomainClass domainInstance = DomainClass.findById(params.id);
        forward (action: 'action2', model: [domainInstance: domainInstance]); 
    }
    
    def action2() = {
        DomainClass domainInstance = request?.domainInstance ?: DomainClass.findById(params.id);
        [domainInstance: domainInstance]; 
    }
    

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

Как видите, синтаксис для обоих практически идентичен. Но следует предпочесть пересылку запросов в соответствии с рассматриваемым требованием из-за проблемы, упомянутой выше. Еще одна важная деталь касается URL, который просматривается в адресной строке во время загрузки страницы. Переадресация запросов сохранит URL-адрес страницы, а цепочка действий ИЗМЕНИТ URL-адрес страницы к последнему действию.

0 голосов
/ 22 сентября 2016

(Поздно, но ...) Я использую Grails 2.4.4, что позволяет мне делать следующее:

def usernameLogin() {
  SecurityToken securityToken = authService.loginWithUserPass(params.user, params.pass)
  chain action: 'afterLogin', model: [securityToken: securityToken]
}

def ssoLogin() {
  SecurityToken securityToken = authService.ssoLogin(params.remoteUser, params.key)
  chain action: 'afterLogin', model: [securityToken: securityToken]
}

def afterLogin() {
  SecurityToken securityToken = (SecurityToken) chainModel['securityToken']
  if (securityToken.valid) {
    forward action: 'loggedInRedirect'
  }
  else {
    forward action: 'loginFailed'
  }
}
  • SecurityToken - это объект, который содержит строкуи enum
  • Ключ: 1) использование «цепного действия» в исходном действии, 2) использование chainModel в целевом действии

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...