Grails validate()会覆盖拒绝

时间:2011-09-24 20:35:20

标签: validation grails

I'm aware that it's a bug,但在域类上调用validate()会覆盖之前放入的任何拒绝:

def save = {
    def assignment = new Assignment(params)

    assignment.errors.reject("assignment.error")

    // Save
    if (assignment.validate()) {
        //rejected error is gone
        assignment.save()
        redirect action: "list"
    }
    else {
        //render errors
        render view: "create", model: [instance: assignment]
    }
}

所以,直到这个问题得到修复(它自grails 1.0以来它已经存在并且现在几乎为2.0),是否有任何智能解决方法来保留拒绝并立即使用if validate()然后save()范例?

2 个答案:

答案 0 :(得分:3)

这不是一个错误,它是设计的。通过调用validate(),您要求验证过程重新开始。如果您希望手动reject()来电包含在错误中,请在调用validate()后将其置于其中。

答案 1 :(得分:0)

可悲的是,@ Burt是对的。这是设计,虽然这种设计是粗略的。 问题是,在某些情况下,grails会在幕后自行验证,擦除不应擦除的自定义错误。

因此,您不仅要避免调用validate(),还必须避免平台在各个点上静默地删除错误。

有时您可以使用 Domain.read(params.id)而不是Domain.get(params.id)来解决这个问题。

Grails read() Docs

在我看来,手动添加错误和grails自动行为之间的关系是非直观的。