2015-06-12 2 views
0

Я пытаюсь передать результат проверки валидации из формы в новое представление, где будут отображаться поля, которые не прошли проверку. Мой код продолжает отображать сообщение об ошибке вместо validationResult, которое появляется в параметрах url.Grails извлекает параметры контроллера в g: каждый

Метод, который проверяет проверки заключается в следующем:

def confirmFormToSave() { 
    def ticket = Ticket.get(params.ticketId) 
    def ticketId = params.ticketId as long 
    ValidationResult validationResult = ticketService.validateCurrentTicketForms("", ticketId) 
    if (!ticketValidationResult.isPassed()) { 
     log.error "Validation failure, cannot change Ticket status" 
     redirect(action: 'validateForm', params: [id: params.ticketId, validationResult: validationResult]) 
     return 
    } else { 
     params.isGroup = false 
     redirect(action: 'submitForm', params: params) 
    } 
    } 

Это переадресовывает на ошибки проверки на следующий метод, который придающей GSP:

def validateForm() { 
    def ticket = Ticket.get(params.ticketId) 
    def ticketId = params.ticketId as long 
    ValidationResult validationResult = ticketService.validateCurrentTicketForms("", ticketId) 
    def message = 'Sorry, we could not change the ticket state, validation has failed, please fill out all required fields.' 
     [ticket: ticket, message: message, validationResult: validationResult] 
    } 

Мои тянуть это обратно в GSP заключается в следующем:

<g:each in="${validationResult}" var="resultError"> 
    <li>${resultError}</li> 
</g:each> 

Я не уверен, передаю ли параметры между t wo, потому что на данный момент я дважды проверяю один и тот же результат, чтобы сделать это в validateForm.gsp, что кажется неправильным.

+0

Это ** ValidationResult ** вы используете для г: каждый тег, кажется, его объект. Насколько я знаю, вы используете списки для ** в ** параметре в ** g: каждый тег **. Было бы полезно, если бы вы отправили сообщение об ошибке. – Sanshila

ответ

0

я вижу какие-то странные вещи в вашем коде:

1) Вы используете редирект вместо вперед или прямой вызов метода. Перенаправление http - это всего лишь код ответа 3xx с заголовком Redirect в браузер с новым URL-адресом. Ваш браузер обнаружит код ответа, прочитает заголовок Redirect и загрузит новую страницу с новым HTTP-запросом. Более подробная информация: https://en.wikipedia.org/wiki/URL_redirection

Таким образом, PARAMS карты вы используете в перенаправлении будет преобразована в URL, как этот: validateForm?id=WHATEVER&validationResult=WHATEVER, превращая объект ValidationResult в строке, и я думаю, вы не хотите, чтобы сделать это, потому что вы вам нужен итерируемый объект в вашей модели, чтобы закодировать его с помощью тега <g:each>. Вот почему вам нужно снова выполнить проверку в действии validateForm.

Вы не должны использовать перенаправление, если у вас есть объекты (или что-то еще) в вашем действии, если они вам понадобятся в вашей модели.

2) В вашем confirmToSave действия вы загружаете Ticket объект из базы данных, но эта переменная не используется в коде (это не имеет большого значения)

3) Вы отправляете «ID» параметров в ваша карта перенаправления params, но вы получаете параметр «ticketId» в действии validateForm.

Моя рекомендация является оказание validateForm GSP от confirmFormSave непосредственно без редиректа, что-то вроде этого:

def confirmFormToSave(Long tickectId) {  
    ValidationResult validationResult = ticketService.validateCurrentTicketForms("", ticketId) 
    if (!ticketValidationResult.isPassed()) { 
     log.error "Validation failure, cannot change Ticket status" 
     String message = 'Sorry, we could not change the ticket state, validation has failed, please fill out all required fields.' 
     Ticket ticket = Ticket.get(ticketId) 
     return render(view: "validateForm", model: [ticket: ticket, message: message, validationResult: validationResult]) 
    } else { 
     params.isGroup = false 
     redirect(action: 'submitForm', params: params) 
    } 
    }