(Решено, обойдено) Grails: как передать модель на просмотр другого контроллера? - PullRequest
0 голосов
/ 25 января 2012

Я новичок в Grails и не смог найти ответ, как я могу передать модель между контроллерами.

У меня такая ситуация, что есть представления «Потенциальный клиент» и «Запрос клиента».

Возможно, что пользователь захочет создать запрос клиента из информации о потенциальном клиенте.

Я думал о заполнении объектов модели внутри действия преобразования 100 * * PotentialClientController и chain это к действию создания ClientRequestController .Было бы хорошо, если бы у пользователя была возможность редактировать данные перед сохранением, и, возможно, он решит не сохранять их.Поэтому я не хочу сохранять заполненный ClientRequest экземпляр внутри transform action, я хочу передать его в create view другого контроллера.И я не хочу обрабатывать params внутри create action.Конечно, я могу передавать идентификаторы уже существующих объектов и использовать их внутри действия create , но для меня было бы проще передать модель.

Как правильно это сделать?

Ниже приведен пример того, что я пытаюсь сделать: Преобразовать действие контроллера потенциального клиента:

def transform = {
    def requestor = User.getByUsername(principal.username)

    def potentialClientInstance = PotentialClient.get( params.id )
    boolean hasEnoughtRights = checkRights()
    if(!hasEnoughtRights) {
        redirect(controller: 'login', action: 'denied')
    }

    ClientRequest clientRequestInstance = new ClientRequest()

    ContactPerson contactPersonInstance = ContactPerson.get(potentialClientInstance?.contactPerson?.id)
    Contact mobilePhoneContactInstance
    Contact workPhoneContactInstance
    Contact homePhoneContactInstance
    Contact organizationPhoneContactInstance
    Contact emailContactInstance
    ...........................

    clientRequestInstance?.ownedBroker = requestor
    clientRequestInstance?.organization = Organization.get(potentialClientInstance?.organization?.id)
    clientRequestInstance?.brand = new Brand(name: clientRequestInstance?.organization?.getBrandsString())
    clientRequestInstance?.estateType = EstateTypeDic.get(potentialClientInstance?.estateType?.id)
    clientRequestInstance?.footageFrom = potentialClientInstance?.footageFrom
    clientRequestInstance?.footageTo = potentialClientInstance?.footageTo
    clientRequestInstance?.priceFrom = potentialClientInstance?.priceFrom
    clientRequestInstance?.priceTo = potentialClientInstance?.priceTo
    clientRequestInstance?.currency = CurrencyDic.get(potentialClientInstance?.currency?.id)
    clientRequestInstance?.requestComment = Comment.get(potentialClientInstance?.comment?.id)
    clientRequestInstance?.comments?.setComments(potentialClientInstance?.comments)
    clientRequestInstance?.district = District.get(potentialClientInstance?.address?.district)
    clientRequestInstance?.addedBy = requestor
    clientRequestInstance?.modifiedBy = requestor


    chain (controller: 'clientRequest', action: 'create', model: [clientRequestInstance:clientRequestInstance, contactPersonInstance:contactPersonInstance, mobilePhoneContactInstance:mobilePhoneContactInstance, workPhoneContactInstance:workPhoneContactInstance, homePhoneContactInstance:homePhoneContactInstance, organizationPhoneContactInstance:organizationPhoneContactInstance, emailContactInstance:emailContactInstance,])
}

Создать действие контроллера клиентских запросов

def create = {
        def clientRequestInstance = new ClientRequest()
        clientRequestInstance.properties = params
        return ['clientRequestInstance':clientRequestInstance]
}

1 Ответ

0 голосов
/ 27 января 2012

Решение было довольно простым.

Я использовал перенаправление в действии преобразования и передал идентификатор потенциального клиента в качестве параметров:

def transform = {
        def requestor = User.getByUsername(principal.username)

        def potentialClientInstance = PotentialClient.get( params.id )
        boolean hasEnoughtRights = checkRights()
        if(!hasEnoughtRights) {
                redirect(controller: 'login', action: 'denied')
        }

    redirect(controller: 'clientRequest', action: 'create', params: [potentialClientId: params.id])
}

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

def create = {

        def clientRequestInstance = new ClientRequest()
        def requestor = User.getByUsername(principal.username)

        ContactPerson contactPersonInstance
        Contact mobilePhoneContactInstance
        Contact workPhoneContactInstance
        Contact homePhoneContactInstance
        Contact organizationPhoneContactInstance
        Contact emailContactInstance
        if(params.potentialClientId) {
            PotentialClient potentialClientInstance = PotentialClient.get(params.potentialClientId)

            clientRequestInstance = new ClientRequest()

            contactPersonInstance = ContactPerson.get(potentialClientInstance?.contactPerson?.id)

                          ...............................

            clientRequestInstance?.ownedBroker = requestor
            clientRequestInstance?.organization = Organization.get(potentialClientInstance?.organization?.id)
            clientRequestInstance?.organization?.ownedBroker = requestor
            String brands = clientRequestInstance?.organization?.getBrandsString()
            if(brands) {
                clientRequestInstance?.brand = new Brand(name: clientRequestInstance?.organization?.getBrandsString())
            }
            clientRequestInstance?.estateType = EstateTypeDic.get(potentialClientInstance?.estateType?.id)
            clientRequestInstance?.footageFrom = potentialClientInstance?.footageFrom
            clientRequestInstance?.footageTo = potentialClientInstance?.footageTo
            clientRequestInstance?.priceFrom = potentialClientInstance?.priceFrom
            clientRequestInstance?.priceTo = potentialClientInstance?.priceTo
            clientRequestInstance?.currency = CurrencyDic.get(potentialClientInstance?.currency?.id)
            clientRequestInstance?.requestComment = Comment.get(potentialClientInstance?.comment?.id)
            potentialClientInstance?.comments?.each {
                clientRequestInstance?.addToComments(it)
            }
            clientRequestInstance?.district = District.get(potentialClientInstance?.address?.district)
            clientRequestInstance?.addedBy = requestor
            clientRequestInstance?.modifiedBy = requestor

        } else {
            clientRequestInstance.properties = params
        }
        return ['clientRequestInstance': clientRequestInstance, 'contactPersonInstance': contactPersonInstance, 
            'mobilePhoneContactInstance': mobilePhoneContactInstance,
            'workPhoneContactInstance': workPhoneContactInstance,
            'homePhoneContactInstance': homePhoneContactInstance,
            'organizationPhoneContactInstance': organizationPhoneContactInstance,
            'emailContactInstance': emailContactInstance]
    }
...