gpt4 book ai didi

grails - grails中保存和更新方法的成语

转载 作者:行者123 更新时间:2023-12-02 13:54:07 25 4
gpt4 key购买 nike

grails 中是否有任何习语可以帮助我们保存域对象?

例如

我可能想做类似的事情


if(candidate.hasErrors || !candidate.save)
{
candidate.errors.each {
log it



}


但是,我不想将逻辑传播到我做 domainObject.save 的所有地方。

我也不想要单独的类,比如我将这个 domainObject 传递给的 repo 并放入这个逻辑

谢谢
苏达山

最佳答案

这是我用来验证和保存的服务方法,但在失败时记录已解决的验证消息。使用它而不是仅仅使用 println error 会很有帮助。或 log.warn error因为错误对象的 toString() 非常冗长,您只想查看 GSP 上显示的内容:

class MyService {
def messageSource

def saveOrUpdate(bean, flush = false) {
return validate(bean) ? bean.save(flush: flush) : null
}

boolean validate(bean) {
bean.validate()
if (bean.hasErrors()) {
if (log.isEnabledFor(Level.WARN)) {
def message = new StringBuilder(
"problem ${bean.id ? 'updating' : 'creating'} ${bean.getClass().simpleName}: $bean")
def locale = Locale.getDefault()
for (fieldErrors in bean.errors) {
for (error in fieldErrors.allErrors) {
message.append("\n\t")
message.append(messageSource.getMessage(error, locale))
}
}
log.warn message
}
bean.discard()
return false
}

return true
}

这是 Controller 中的一个示例:
class MyController {

def myService

def actionName = {
def thing = new Thing(params)
if (myService.saveOrUpdate(thing)) {
redirect action: 'show', id: thing.id
}
else {
render view: 'create', model: [thing: thing]
}
}
}

编辑:也可以将这些方法添加到 MetaClass,例如在 BootStrap.groovy 中:
class BootStrap {

def grailsApplication
def messageSource

def init = { servletContext ->

for (dc in grailsApplication.domainClasses) {
dc.metaClass.saveOrUpdate = { boolean flush = false ->
validateWithWarnings() ? delegate.save(flush: flush) : null
}

dc.metaClass.validateWithWarnings = { ->
delegate.validate()
if (delegate.hasErrors()) {
def message = new StringBuilder(
"problem ${delegate.id ? 'updating' : 'creating'} ${delegate.getClass().simpleName}: $delegate")
def locale = Locale.getDefault()
for (fieldErrors in delegate.errors) {
for (error in fieldErrors.allErrors) {
message.append("\n\t")
message.append(messageSource.getMessage(error, locale))
}
}
log.warn message
delegate.discard()
return false
}

return true
}
}
}
}

这取决于范围内的“日志”变量,这在任何 Grails 工件中都是正确的。这会稍微改变 Controller 的使用:
class MyController {

def actionName = {
def thing = new Thing(params)
if (thing.saveOrUpdate()) {
redirect action: 'show', id: thing.id
}
else {
render view: 'create', model: [thing: thing]
}
}
}

作为元类方法,重命名它可能更有意义,例如 saveWithWarnings() .

关于grails - grails中保存和更新方法的成语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5343528/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com