Есть много разных способов сделать это и, возможно, 1 или более плагинов, чтобы вы могли работать. Однако я покажу вам, как я вообще с этим справляюсь. У меня есть объект, который выглядит следующим образом ...
class AjaxPostResponse {
boolean success
String message
String html
def domainObject
def errors = [:]
}
Это объект, который я отображаю как JSON. Таким образом, если есть ошибки проверки, успех становится ложным, и я добавляю все ошибки в карту ошибок. Я делаю это в сервисе, и этот метод выглядит так:
def preparePostResponse(domainInstance) {
def g = grailsApplication.mainContext.getBean('org.codehaus.groovy.grails.plugins.web.taglib.ApplicationTagLib')
def postResponse = new AjaxPostResponse(domainObject: domainInstance)
if (domainInstance.hasErrors()) {
g.eachError(bean: domainInstance) {
postResponse.errors."${it.field}" = g.message(error: it)
}
postResponse.success = false
postResponse.message = "There was an error"
} else {
postResponse.success = true
postResponse.message = "Success"
}
return postResponse
}
Так что мой контроллер выглядит примерно так
def save = {
def someObjInstance = new SomeObj(params)
someObjInstance.save(flush:true)
render myService.preparePostResponse(someObjInstance) as JSON
}
В моем клиентском коде я делаю что-то вроде этого (используя плагин формы jQuery, но это также будет работать с универсальным методом $ .ajax / $ .post / $ .get ...
$(formElement).ajaxSubmit({
dataType: 'json',
success: function(jsonData) {
if (jsonData.success) {
// do good stuff
} else {
// bad stuff happened
showErrors(jsonData.errors);
}
}
});
И моя функция showErrors
function showErrors(errors, element) {
var errorList = $("<ul>");
for (field in errors) {
errorList.append("<li>" + errors[field] + "</li>")
$('input[name=' + field + ']').addClass('error');
}
if (!element) {
$(".errors").html("").append(errorList).show(500);
} else {
$(element).html("").append(errorList).show(500);
}
}
Надеюсь, это поможет.