我是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