2013-05-09 31 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