我是grails的新手,並試圖創建一個表單,允許用戶更改與他/她的帳戶關聯的電子郵件地址,我爲他創建的網站。Grails,我如何得到一個對象不保存
它要求用戶輸入他們當前的密碼以及他們想要使用的新電子郵件地址。 如果用戶輸入了錯誤的密碼或無效的電子郵件地址,則應該用相應的錯誤消息拒絕它們。
現在可以通過grails中的約束來完成電子郵件驗證,但密碼更改必須與其當前密碼相匹配。我已經將此檢查作爲服務類中的一種方法實施。
見下面的代碼:
def saveEmail =
{
def client = ClientUser.get(session.clientUserID)
client.email = params.email
if(clientUserService.checkPassword(session.clientUserID , params.password) ==false)
{
flash.message = "Incorrect Password"
client.discard()
redirect(action:'changeEmail')
}
else if(!client.validate())
{
flash.message = "Invalid Email Address"
redirect(action:'changeEmail')
}
else
{
client.save();
session.clientUserID = null;
flash.message = "Your email address has been changed, please login again"
redirect(controller: 'clientLogin' , action:'index')
}
}
現在我發現很奇怪的是,如果我輸入了一個無效的電子郵件那就不是保存更改(如預期),但如果我輸入了錯誤的密碼和有效的電子郵件,然後它會保存更改,甚至將它們寫回數據庫,即使它會給出正確的「無效密碼」錯誤消息。
我很困惑,所以在所有if/else if/else塊中設置了斷點,並發現它按預期擊中了第一條if語句並且沒有擊中其他語句,所以它絕不會碰到保存的調用()方法,但它仍然保存。
一點點研究,我得出翻過文檔,你可以在上面的代碼看慣丟棄()方法。所以我加了這個,但仍然無濟於事。我甚至嘗試使用丟棄,然後再次從數據庫重新加載客戶端對象,但仍然沒有骰子。
這是非常令人沮喪,我會感謝任何幫助,因爲我認爲這應該肯定不會是一個複雜的需求!
client.discard()應該是這樣做的方式,你可以在集成測試中重現問題嗎? 您使用的是哪個版本的Grails? – leebutts 2010-05-25 21:28:28
我剛剛嘗試過對代碼進行集成測試,奇怪的是,它似乎表現得像我想要的,但是當我通過網絡正常進行時,我又遇到了同樣的問題。 我會發布我的測試代碼,但我不知道如何做到這一點,它告訴我,這是太多的字符 – user350325 2010-05-27 21:34:25
你應該接受下面的答案! – oligofren 2011-05-03 14:54:58