Проверка формы входа в Play! 2.0

public static Result authenticate() {
    Form<LoginForm> loginForm = form(LoginForm.class).bindFromRequest();

    if (loginForm.hasErrors()) {
        return ok(views.html.Account.index.render(loginForm));
    } else {
            String email = loginForm.get().email;
            User user = User.findByUsername(email);

            if (Hash.checkPassword(loginForm.get().password, user.passwordHash)) {
                // set session
                session("email", email);
                return redirect(routes.UserController.view(user.getId()));
            } else {
                return badRequest(views.html.Account.index.render(loginForm));
            }
        }
}

Мы используем этот код для аутентификации пользователей, но мы хотели бы отображать сообщения об ошибках, когда что-то пойдет не так во время входа в систему (неверное имя пользователя/пароль и т. д.). Тем не менее, мы не можем найти какую-либо документацию по этому вопросу в Интернете, так как большая часть документации, касающейся использования флэш-памяти для сообщений об ошибках, в основном относится к Play 1.x.

1) Как мы можем добавить сообщения об ошибках в эту функцию входа в систему?

2) Как мы можем получить доступ к этим сообщениям об ошибках в представлении?

3) Как (вообще) работает форма класса в Play! обрабатывать создание и обработку ошибок (и как мы можем получить к ним доступ?)

Спасибо! :-)


person nicohvi    schedule 29.06.2012    source источник


Ответы (2)


@1) Обычно вы добавляете ошибки через проверку. Итак, ваша форма входа в систему должна иметь метод проверки

@2) form.errors() или fomr.error("Поле") и form.globalErrors()

@3) При привязке ошибки будут созданы и помещены в конструктор формы. Как всегда должно работать form.errors().put(key, error), потому что карта не копируется. Но это больше хак и может быть изменено в будущем.

person niels    schedule 29.06.2012
comment
Спасибо за ответ! Мы используем @Constraints.Required для проверки полей, и это генерирует нужные ошибки. Единственный способ, который мы нашли для доступа к этим ошибкам, — это через помощник FieldElements.errors или через саму карту, что действительно громоздко. - person nicohvi; 29.06.2012
comment
Если вы используете обычный scala-tenplate-helper, они распечатают для вас ошибку, см. образец формы. Так что это обычно легко, и вам не нужно ничего делать, просто используйте помощника. - person niels; 29.06.2012
comment
Но мы хотим распечатать ошибки как группу в поле над полями, а не внутри полей, как в примере. Любая идея, как это сделать? - person nicohvi; 03.07.2012
comment
Просто распечатайте их, перебирая form.errors() и не используйте помощник формы. - person niels; 03.07.2012
comment
Проблема в том, что сообщения об ошибках не будут анализироваться через i18n-переводчик для встроенной проверки (например, @Constraints.Required будет печатать error.required вместо This is Required и т. д.). Я решил это, добавив хак в контроллер, но я хотел бы иметь более плавный способ сделать это. - person nicohvi; 03.07.2012
comment
Вы уверены, что Messages.get(error.key(), error.arguments()) не работает? - person niels; 04.07.2012

Я бы посоветовал form.withError("name", "Error") есть еще form.withGlobalError("Error")

person Tjunkie    schedule 05.07.2013