Har*_*rry 7 validation grails groovy closures constraints
在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
// ...
}
Run Code Online (Sandbox Code Playgroud)
然后建议读者使用startDate上面注释的版本.引用的原因是:该static constraints属性仅被评估一次(在服务器启动时),而我们的目的是在每个实例化和随后的验证中评估它Race.
我的问题是:为什么name约束的非闭包样式适用于每次验证尝试但不适用于startDate约束?而且,相反,如果需要封闭口味startDate,那么为什么它也不是必需的name呢?
如果我正确理解上面的Groovy语法,似乎static constraint块中列出的每个约束在语法上都是对函数的调用,该函数将各种验证属性作为一个Map.现在,由于静态块将在服务器启动时进行评估(一次),因此两个函数调用也会在服务器启动时发生(一次),并且应该在非闭包形式中导致相同且一致的行为.不是吗?
tim*_*tes 10
如果你去:
startDate(min: new Date())
Run Code Online (Sandbox Code Playgroud)
然后new Date()将在服务器启动时进行评估,并且永远不会更改.因此,下周(假设服务器继续运行),它将验证上周的日期.
第二种形式:
startDate(validator: {return (it > new Date())})
Run Code Online (Sandbox Code Playgroud)
将在每次检查约束时进行评估,因此无论服务器运行多长时间,它都将始终针对当前进行验证.
另一方面,当name涉及到它时,它是针对静态内容验证的,即maxSize50是有意义的将它作为键值对而不是使用validator闭包,因为50每次完成验证时都不会评估值,name因为它已经完成对startDate.
在name( maxSize:50 )评估调用调用时,它实际上为该字段创建了一个MaxSizeConstraint对象name.property->constraints然后,grails使用此映射来在验证对象时检查属性.正如您在该课程中所看到的,maxSize是一个私人财产.实际上,如果你想maxSize随着时间的推移而改变,那么你需要使用自定义验证器Date
| 归档时间: |
|
| 查看次数: |
3476 次 |
| 最近记录: |