Как создать представление, которое работает как с запросами HTML, так и с Ajax? - PullRequest
2 голосов
/ 29 августа 2011

Некоторые из моих представлений Play Framework будут принимать обычный запрос (GET через ссылку) и запрос ajax (вызывается из кода javascript, если у пользователя включен js).

Моя настоящая проблема заключается в том, что мой код выглядитдля двух возможностей в одном методе, что-то вроде этого:

public static void lostPassword() {
    HashMap<String, Object> ajax = new HashMap<String, Object>();

    validation.clear();

    validation.required("email", params.get("email"));
    validation.email("email", params.get("email"));

    if (!validation.hasErrors()) {
        Account account = Account.findAccount(params.get("email"));
        if (account != null) {
            // Send the email:
            Mails.lostPassword(account);

            if (request.isAjax()) {
                ajax.put("success", true);
                renderJSON(ajax);
            }
            else {
                renderTemplate("account/password/sent.html");
            }
        }

        validation.addError("email", "This email does not exists."); // TRANS
    }

    if (request.isAjax()) {
        ajax.put("success", false);
        ajax.put("validation", AjaxUtils.fromValidationErrorsToAjax(validation.errors()));
        renderJSON(ajax);
    }
    else {
        validation.keep();
        renderArgs.put("email", params.get("email"));
        renderTemplate("account/password/form.html");
    }
}

Как вы можете видеть, я проверяю, какой тип запроса сделан для возврата правильного ответа, и я уверен, что это нелучший способ сделать это.

Но как бы вы это сделали?

Я думал о создании частного метода, который бы выполнял работу и возвращал логическое значение, но что происходит с объектом проверки?И значит ли это, что мне придется сделать два других метода, один для запроса HTML, другой для запроса AJAX?

Как у вас дела?

Спасибо за вашу помощь!

1 Ответ

3 голосов
/ 30 августа 2011

Вам лучше использовать типы контента. Он позволяет вам использовать один контроллер и несколько Temaplates для вывода в различных форматах. В моей книге я использовал стандартную HTML-страницу и RSS-страницу как два вида одного и того же действия контроллера и связанных данных модели.

Документация Play хорошо объясняет, как ее использовать. http://www.playframework.org/documentation/1.2.3/routes#content-types

По сути, вы можете сделать это программно или в файле маршрутов, или разрешив play определить его по типу контента по типу запроса Http. Последнее задается в вашем ajax-запросе путем специальной настройки JSON в качестве типа контента. Это должно быть просто, особенно если вы используете jquery для ваших запросов Ajax.

...