gpt4 book ai didi

validation - Groovy/Grails : How are constraints implemented?

转载 作者:行者123 更新时间:2023-12-04 10:52:49 25 4
gpt4 key购买 nike

在书中,Getting Started with Grails - 2e ,第 42 页(电子页面,而不是纸质页面),列出了以下示例。

class Race {

static constraints = {

name(blank:false, maxSize:50)


// NOTE: This doesn’t do
// what you think it does
startDate(min: new Date())

// And this is what we're supposed
// to be using:
// startDate(validator: {return (it > new Date())})
}

String name
Date startDate
// ...
}

建议读者使用 startDate 的版本。上面注释掉了。引用的原因是: static constraints属性只会被评估一次(在服务器启动时),而我们的意图是在每次实例化和后续验证 Race 时对其进行评估.

我的问题是:那么为什么 name 的非封闭风格呢?约束适用于每次验证尝试,但不适用于 startDate约束?并且,相反,如果 startDate 需要闭包 flavor ,那为什么 name 不需要也?

如果我正确理解上述 Groovy 语法,似乎 static constraint 中列出的每个约束 block 在语法上是对一个函数的调用,该函数将各种验证属性作为 Map .现在,由于静态 block 将在服务器启动时被评估(一次),两个函数调用也将在服务器启动时发生(一次),并且应该以它们的非封闭形式导致相同且一致的行为。 不是这样吗?

最佳答案

如果你去:

    startDate(min: new Date())
然后 new Date()将在服务器启动时进行评估,并且永远不会改变。所以下周(假设服务器继续运行)它将验证上周的日期。
第二种形式:
    startDate(validator: {return (it > new Date())})
每次检查约束时都会进行评估,因此无论服务器运行了多长时间,它都将始终针对今天进行验证。
另一方面,当 name关心的是,它是针对静态内容进行验证的,即 maxSize为 50,将其作为键值对而不是使用 validator 是有意义的关闭,因为值 50不会在每次对 name 进行验证时进行评估正如 startDate 所做的那样.
编辑:
当调用 name( maxSize:50 )调用被评估,它实际上创建了一个 MaxSizeConstraint object用于字段 name .这张 map property->constraints然后在验证对象时被 grails 用来检查属性。正如您在该类(class)中看到的那样, maxSize是私有(private)属性(property)。确实,如果你想要 maxSize要随时间而改变,那么您需要使用自定义验证器,如 Date

关于validation - Groovy/Grails : How are constraints implemented?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17406616/

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