In meiner Play App habe ich mehrere Aktionen (z. B. "Löschen" einer Entität), die von verschiedenen Seiten ausgelöst werden können. Nachdem die Aktion ausgelöst wurde, möchte ich den Benutzer zurück zu der Seite umleiten, auf der sie sich befanden, bevor ich die Aktion ausgeführt habe. Gibt es dafür ein gutes Muster in Play?Muster zum Umleiten auf die vorherige Seite nach einer Aktion
Antwort
Dies ist, was ich am Ende gefunden habe, obwohl es nicht besonders elegant ist, und ich würde mich für bessere Möglichkeiten interessieren, es zu tun. Ich habe einen versteckten Eingang zu meiner Form mit der aktuellen Seite URL:
@(implicit request: RequestHeader)
...
<form action="@routes.Controller.doStuff()" method="post">
<input type="hidden" name="previousURL" value="@request.uri"/>
...
</form>
Da ist in meinem Controller:
def doStuff() = Action { implicit request =>
val previousURLOpt: Option[String] =
for {
requestMap <- request.body.asFormUrlEncoded
values <- requestMap.get("previousURL")
previousURL <- values.headOption
} yield previousURL
previousURLOpt match {
case Some(previousURL) =>
Redirect(new Call("GET", previousURL))
case None =>
Redirect(routes.Controller.somewhereElse)
}
}
Sie leicht @request.getHeader("referer")
in Ihren Vorlagen, zum Beispiel verwenden können, wenn Sie auf eine Schaltfläche stornieren dass sollten Sie auf die vorherige Seite umleiten, verwenden Sie diese:
<a href="@request.getHeader("referer")">Cancel</a>
auf diese Weise, Sie brauchen keine zusätzliche Informationen, um Ihre Vorlagen zu übergeben. (Getestet mit Spiel 2.3.4)
Der einfachste Weg, die ich gefunden habe, dies zu tun, ist aus Ihrer Controller-Methode, verwenden:
String refererUrl = request().getHeader("referer");
Also, würden Sie so etwas wie tun:
Denken Sie daran, Sie müssen eine Umleitung() und keine render() mit einer Flash-Nachricht.
suchen Sie nach etwas Besserem als den referer über request.getHeader abzurufen und in Flash oder Session zu speichern? Ich wäre daran interessiert, auch von besseren Wegen zu hören. Update: Habe gerade festgestellt, dass du nach Scala gefragt hast. –
@alihaider Ich habe die Lösung eingefügt, die ich unten verwendet habe, aber vielleicht wäre es besser, den Referrer zu verwenden? –
Siehe auch http://stackoverflow.com/questions/14891988/redirect-to-referer-after-a-post-request –