Play に Web アプリケーションがあります。Web アプリケーションは複数のページで構成されています。すべてのページには、ユーザーが言語 (ロケール) をドイツ語から英語に、またはその逆に変更できるようにする小さなフラグがあります。
リファラーへのリダイレクトでこれを処理します。
def referer(implicit request: Request[AnyContent]) =
request.headers.get(REFERER).getOrElse(mainUrl)
def locale(l: String) = Authenticated { user =>
implicit request =>
Redirect(referer).withCookies(Cookie(LANG, if (l == "de" || l == "en") l else "de"))
}
正常に動作しています。まあ、少なくとも GET リクエストについては。
ユーザーがフォームにデータを入力する必要がある特定のページがあります。このフォームはサーバーに POST されます。エラーが見つかった場合は、通常どおり、エラー メッセージとともにフォームが再度表示されます。ここで、ユーザーが (フラグをクリックして) 言語を変更したい場合、リファラーへのリダイレクトは機能しません。これは、GET リクエストを使用しようとするためであり、Play はこのメソッドの GET ルートが存在しないと不平を言います (これはは真です)。
フォームをキャッシュし、フォームがキャッシュから取得される別のメソッドを定義することで、これを解決しています。
# User data is POSTed to the server
POST /create/insert controllers.MyCreate.insert()
# After a redirect the cached form is displayed again
GET /create/insert controllers.MyCreate.insertGet()
それはうまくいきますが、私はこの解決策が好きではありません。この問題に対処するためだけに、ルートに別のエントリと別の方法を作成する必要があるのは普通ではないようです。アプリケーションのすべての POST ルートにこのハックを追加する必要があります!
これに対するよりエレガントな解決策はありますか?