Я новичок в 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 (), который вы можете использовать в приведенном выше коде. Я добавил это, но все равно безрезультатно. Я даже пытался использовать discard, а затем перезагружать клиентский объект из БД, но все еще без кубиков.
Это очень расстраивает, и я был бы признателен за любую помощь, поскольку я думаю, что это, безусловно, не должно быть сложным требованием!