2010-11-18 58 views
1

我想確保代表布爾值的兩個表單字段中的一個被選中。但是沒有適當的限制來做到這一點。 nullable: false不起作用。如何確保在Grails中設置布爾型字段?

class Organisation { 

    Boolean selfInspecting 

    static constraints = { 
     selfInspecting(nullable: false) 
    } 

} 

如何檢查兩個字段中的一個是否被選中?

回答

2

你也可以在控制器中檢查這個,例如,

if (params.checkBox1 != 'on' && params.checkBox2 != 'on') 
    flash.error = 'At least one value must be checked.' 
    return ... 
3

也許最簡單的方法是使用確保選取值的表單。因此,創建單選按鈕而不是複選框是更好的解決方案。它也會直接代表你的意圖。

+0

此外,複選框表示多個布爾值。根據你的例子,我只希望看到一個複選框或一個有/無選項的收音機組。你也可以設置selfInspecting = true |在您的域名中爲false,以便無論發生什麼,它都具有非null的默認值。或者使用默認爲false的原始布爾值。 – Gregg 2010-11-18 16:45:28

+0

我想使用單選按鈕,但我不想預選一個,因爲用戶可能會不小心接受我的預選。 – deamon 2010-11-18 16:53:23

1

你可以編寫你自己的自定義驗證器。

selfInspecting(validator: {val, obj -> /*test selfInspecting here*/}) 

編輯 - 響應對方的回答 - 你可以在表格上處理這個問題,但你也應該處理它的服務器上。

另一編輯 - 在評論中建議您可能要驗證Domain類中兩個字段中的一個。這也可以通過自定義驗證器輕鬆完成。通過上面的自定義驗證器閉包的簽名,val是值selfInspecting,而obj是域對象實例。所以你可以有

{ val, obj -> 

    if (val == null) return false // if you want to ensure selfInspecting is not null 
    else return true 

    ... or ... 

    // if you want to check that at least 1 of two fields is not null 
    def oneOrTheOther = false 
    if (obj.field1 != null || obj.field2 != null) 
     oneOrTheOther = true 
    return oneOrTheOther 

} 
+0

如果將selfInspecting設置爲默認值或使用基本布爾值,則不需要自定義驗證。 – Gregg 2010-11-18 16:52:46

+0

@gregg,控制器/服務代碼不能(意外)將該值清空? – hvgotcodes 2010-11-18 17:04:22

+0

我想他們可以,如果使用布爾對象,而不是原語。但是這也可能在驗證之後發生,因此測試是關鍵。 ;) – Gregg 2010-11-18 17:33:59

相關問題