2013-05-09 59 views
2

我对grails很陌生,所以我希望不要让自己在我的监督下感到尴尬,但我已经试验过这个问题两次,经历了“inList”的一致性失败,从双打列表中进行验证。我寻找这个问题的先前报告,可以找到一个。所以这里是:我无法验证双击列表中的双打列表中的双打列表'

我想用inList约束来验证可接受双打列表中的double类型的字段。脚手架生成的逻辑确实使用g:select正确显示网页上的双打列表。当我从下拉列表中选择任何有效的双打时,域类中的“inList”验证将拒绝它们。例如,如果我从下拉列表中选择'2.0',则在网页上出现此错误消息:

列表[class Demo2.FloatsOkInList]中的值[2]的属性[aFloat]未包含在列表中[[1.0,2.0,3.0,4.0]]

好的,我可以看到,“2.0”已条纹回“2”,所以往返期间我的提交可以或者格式化以供显示或转换成一个整数或字符串。但是我的代码没有完成这个转换。我的控制器是我没有修改过的纯模板。我的域代码是这样的:

class FloatsOkInList { 
    String aKey 
    Double aFloat 
    static constraints = { 
     aKey unique : true, blank : false 
     aFloat blank : false , inList :[ 1.0, 2.0, 3.0, 4.0] 
    } 
} 

视图生成一个场,看起来像这样:

<g:select name="aFloat" from="${floatsOkInListInstance.constraints.aFloat.inList}" required="" value="${fieldValue(bean: floatsOkInListInstance, field: 'aFloat')}" valueMessagePrefix="floatsOkInList.aFloat"/> 

我不认为这是不合理的“INLIST”验证对双打的名单。

应用现状 应用版本:0.1 Grails的版本:2.2.1 Groovy的版本:2.0.7 JVM版本:1.7.0_01 重装活性:真 控制器:2个 域:1 ...

回答

1

1.0默认为BigDecimal
[ 1.0, 2.0, 3.0, 4.0]是BigDecimal的列表。
Double将不在以上列表中。

assert !1.0D in [1.0, 2.0, 3.0, 4.0]

使用 inList: [1D, 2D, 3D, 4D]inList: (1..4)*.toDouble()

中,而不是限制

+0

感谢您的一个非常令人满意的解决方案。在我处理验证问题的过程中,我写了一个自定义的验证器,它包含了这个验证器:[1.0,2.0,3.0,4.0] find {ot - > ot.equals(itt)}我不明白为什么它是失败。这不仅仅是您的解决方案的另一种体现:[] { .equals()}?顺便说一下,当我用'ot.equals(itt)'代替'ot == itt'时,这个闭包对我有用。那么,“==”必须更容忍左右不同的数据类型? – Bewildermint 2013-05-09 02:45:13

+0

很好的问题,如果你最近开始使用Groovy/Grails。请参阅[Groovy Common Gotchas](http://groovy.codehaus.org/Differences+from+Java)以获得答案。总结:在Groovy中'=='表示equals()'。我敢打赌,你会喜欢阅读。 – dmahapatro 2013-05-09 02:51:57