2011-09-24 54 views
3

I'm aware that it's a bug,但調用驗證()上的域類會覆蓋放在之前任何次品:Grails的驗證()覆蓋拒絕

def save = { 
    def assignment = new Assignment(params) 

    assignment.errors.reject("assignment.error") 

    // Save 
    if (assignment.validate()) { 
     //rejected error is gone 
     assignment.save() 
     redirect action: "list" 
    } 
    else { 
     //render errors 
     render view: "create", model: [instance: assignment] 
    } 
} 

所以,直到這個問題是固定的(它的存在了,因爲Grails的1.0現在幾乎是2.0),是否有任何智能的解決方法來保留拒絕,並一次性使用if validate()和save()範例?

回答

3

這不是一個錯誤,它是由設計。通過調用validate()您要求驗證過程重新開始。如果您希望手動呼叫reject()包含在錯誤中,請在呼叫validate()之後將它們放入。

+0

問題在於validate()會拒絕在代碼中執行控制器時會通過服務運行代碼的字段,因此如果該代碼返回某些錯誤,則需要拒絕。如果我事先調用validate(),那麼即使代碼成功,這些錯誤仍將保留在那裏。 – Art

0

@Burt很傷心。這是設計,儘管這種設計粗略。 問題是,在某些情況下,grails在幕後自行驗證,擦除不應擦除的自定義錯誤。

因此,您不僅要避免調用validate(),還必須避免平臺以各種方式靜靜地擦除您的錯誤。

有時你可以通過使用Domain.read(params.id)而不是Domain.get(params.id)來解決此問題。

Grails read() Docs

手動添加錯誤和Grails自動行爲之間的關係,導致在我看來是相當不直觀。