Последовательность действий не перенаправляется после Controller.await (int millis) - PullRequest
0 голосов
/ 06 сентября 2011

Я не уверен, что это не работает так, как задумано, просто я запутался.

Что я хотел бы сделать, так это асинхронно задержать действие, и await(int millis), и мне кажется,чтобы стать друзьями.

Вот что происходит:

1. Application.index отображает форму, которая отправляет сообщение POST на Application.something.

app / controllers / Application.java

public static void index() {
    render();
}

app / views / Application / index.html

#{form @Application.something()}
    <input type="submit">
#{/form}

2. Application.something делает свое дело и затем возвращается к index.

app / controllers / Application.java

public static void something() {
    await(500);

    // Here be business

    index();
}

3. При воспроизведении возникает ошибка приложения: «Шаблон Application /thing.html не существует» .

Поэтому, когда render()вызывается в Application.index после того, как выполнение в Application.something было приостановлено / возобновлено, он пытается воспроизвести шаблон Application.something, который, конечно, не существует.

Если я удаляю await(500), все работает простоштраф (302 выдается иindex отображается как положено).

Я могу принудительно перенаправить с помощью

redirect("/");

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

Я могутакже установите

request.action = "Application.index";

вручную сразу после await, и рендер в Application.index работает (фактически, магия в Controller.template() работает), как и предполагалось.


Такв принципе, все ли в порядке, и я вынужден жить с использованием строк после await вместо вызовов методов или что-то не так?

Приветствия, Тобиас.

1 Ответ

0 голосов
/ 12 сентября 2011

Когда вы вызываете метод await (), Play приостанавливает этот HTTP-запрос. По истечении времени ожидания он снова запускается как новый запрос HTTPRequest, как будто вызывается снова.

В первом случае, без использования метода await (), перенаправление происходит правильно - это потому, что этот вызов метода правильно перехватывается платформой Play, а при генерации обратного маршрута маршрутизатора создается URL, необходимый для перенаправления 302 , (Подробности в документации ActionChaining)

Но во втором случае после метода await () создается новый HTTPRequest, и цепочка действий не происходит - это означает, что среда не перехватывает вызов метода index (). Это выполняется как любой другой метод, поэтому вы не видите перенаправления.

...