【发布时间】:2011-02-23 21:49:03
【问题描述】:
我是 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 语句,而没有命中其他语句,所以它永远不会遇到对 save( ) 方法,但它还是被保存了。
经过一番研究,我找到了有关 discard() 方法的文档,您可以在上面的代码中看到该方法。所以我添加了这个,但仍然无济于事。我什至尝试使用丢弃,然后再次从数据库重新加载客户端对象,但仍然没有骰子。
这很令人沮丧,如果能得到任何帮助,我将不胜感激,因为我认为这肯定不是一个复杂的要求!
【问题讨论】:
-
client.discard() 应该是这样做的方法,你能在集成测试中重现这个问题吗?您使用的是什么版本的 Grails?
-
我刚刚尝试了对代码的集成测试,奇怪的是它似乎表现得如我所愿,但是当我通过网络正常进行时,我又遇到了同样的问题。我会发布我的测试代码,但我不知道如何在这里做,它告诉我它的字符太多
-
你应该接受下面的答案!
标签: java grails groovy grails-orm