我想確保代表布爾值的兩個表單字段中的一個被選中。但是沒有適當的限制來做到這一點。 nullable: false
不起作用。如何確保在Grails中設置布爾型字段?
class Organisation {
Boolean selfInspecting
static constraints = {
selfInspecting(nullable: false)
}
}
如何檢查兩個字段中的一個是否被選中?
我想確保代表布爾值的兩個表單字段中的一個被選中。但是沒有適當的限制來做到這一點。 nullable: false
不起作用。如何確保在Grails中設置布爾型字段?
class Organisation {
Boolean selfInspecting
static constraints = {
selfInspecting(nullable: false)
}
}
如何檢查兩個字段中的一個是否被選中?
你也可以在控制器中檢查這個,例如,
if (params.checkBox1 != 'on' && params.checkBox2 != 'on')
flash.error = 'At least one value must be checked.'
return ...
也許最簡單的方法是使用確保選取值的表單。因此,創建單選按鈕而不是複選框是更好的解決方案。它也會直接代表你的意圖。
你可以編寫你自己的自定義驗證器。
像
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
}
如果將selfInspecting設置爲默認值或使用基本布爾值,則不需要自定義驗證。 – Gregg 2010-11-18 16:52:46
@gregg,控制器/服務代碼不能(意外)將該值清空? – hvgotcodes 2010-11-18 17:04:22
我想他們可以,如果使用布爾對象,而不是原語。但是這也可能在驗證之後發生,因此測試是關鍵。 ;) – Gregg 2010-11-18 17:33:59
此外,複選框表示多個布爾值。根據你的例子,我只希望看到一個複選框或一個有/無選項的收音機組。你也可以設置selfInspecting = true |在您的域名中爲false,以便無論發生什麼,它都具有非null的默認值。或者使用默認爲false的原始布爾值。 – Gregg 2010-11-18 16:45:28
我想使用單選按鈕,但我不想預選一個,因爲用戶可能會不小心接受我的預選。 – deamon 2010-11-18 16:53:23