2016-06-07 32 views
1

我正在使用grails 2.4.4和腳手架生成的默認更新方法。假設它是:grails-scafold更新防止保存

@Transactional 
def update(Club clubInstance) { 
    if (clubInstance == null) { 
     notFound() 
     return 
    } 

    if (clubInstance.hasErrors()) { 
     respond clubInstance.errors, view:'create' 
     return 
    } 

    clubInstance.save flush:true 

    request.withFormat { 
     form { 
      flash.message = message(code: 'default.created.message', args: [message(code: 'clubInstance.label', default: 'Club'), clubInstance.id]) 
      redirect clubInstance 
     } 
     '*' { respond clubInstance, [status: CREATED] } 
    } 
} 

我想在某些情況下防止儲蓄。但我發現我可以用全部替換方法:

@Transactional 
def save(Club clubInstance) { 
    redirect action:"index" 
} 

它仍然保存數據。只有當我從參數中刪除Club clubInstance時,它纔會停止將數據保存到db。誰能告訴我爲什麼會發生,我如何控制儲蓄?

+1

這是因爲OSIV(視圖中的打開會話)將實例刷新到數據庫。在重定向之前,在方法中使用'clubInstance.discard()'丟棄它。 –

+0

調用'discard'不是正確的解決方案。如果他希望'save'動作要做的就是重定向到'index',那麼只需從'save'方法中刪除'Club clubInstance'參數,並保留'redirect',如他的示例所示。如果您要做的只是放棄更改,沒有理由檢索對象並進行數據綁定。 –

+2

如果場景涉及有條件地發出重定向(這在示例代碼中未顯示),那麼丟棄可能是有意義的。 –

回答

0

感謝您的意見。這是我想要的 - 有條件的保存。

@Transactional 
def save(Club clubInstance) { 
    if(testSomeCondition()) 
     clubInstance.save flush:true 
    else 
     clubInstance.discard() 
    redirect action:"index" 
}