При обработке ошибок в формах в Play Framework 2 (Java) я хочу представить общее сообщение об ошибке, предупреждающее пользователя о том, что что-то пошло не так, например. "Форма X не обновляется". Один из способов сделать это, в дополнение к ошибкам для каждого поля формы, чтобы создать глобальную ошибку, а затем представить это на каждом шаблоне:Как обрабатывать глобальные ошибки в формах в Play Framework 2 (Java)
Контроллер:
if(form.hasErrors()) {
form.reject("Form X not updated."); // This creates a global error
}
Шаблон:
@if(form.hasGlobalErrors) {
@someFunctionToPresentErrors(from.globalError.message))
}
Однако, этот идентичный фрагмент кода каждый шаблон, содержащий форму, нарушает принцип DRY.
Мой лучшее решение до сих пор, чтобы добавить сообщение об ошибке Http.Context
вместо, а затем перехватывать сообщение об ошибке в главном шаблоне, который вызывается каждый шаблон:
Контроллер:
Http.Context.current().args.put("error", "Form X not updated.");
Основной шаблон :
@if(Http.Context.current().args.containsKey("error")){
@someFunctionToPresentErrors(
Http.Context.current().args.get("error").asInstanceOf[String])
}
Это лучше, потому что это позволяет мне хранить материал презентации ошибок в одном месте, но это похоже на злоупотребление Http.Context
. Обратите внимание, что также может использоваться для неявной передачи переменных и дает тот же эффект, что и Http.Context
, но это недопустимо при вызове badRequest(...)
, поскольку флэш-память должна использоваться только для перенаправления. В любом случае, я думаю, что должен быть лучший способ сделать это, используя механизм формы, предоставляемый Play Framework.
Есть ли наилучшая практика для этого?
Я уже рассматривал это решение. Однако, когда вы вызываете 'badRequest()' (как и при возникновении ошибки в форме), вы не должны одновременно использовать flash. Фактически, если вы это сделаете, это приведет к предупреждению: _ Вы используете код состояния «400» с миганием, который должен использоваться только с статусом перенаправления! _. Поэтому я решил использовать 'Http.Context'rather, чем flash. Однако идея одна и та же, а именно: избегать передачи параметров вокруг. – plade
Теперь я обновил вопрос с информацией о вспышке. – plade
TBH Я не понимаю, для чего генерируется это предупреждение (BTW только в режиме DEV). Лично, пока он не работает (по крайней мере до 2.3.x), я собираюсь использовать его для заполнения простых сообщений даже без перенаправления. Если будущие версии отключат его - я буду искать другое решение :) – biesior