2013-07-01 5 views
8

私のプレイアプリケーションでは、別のページからトリガできるいくつかのアクション(エンティティの「削除」など)があります。アクションがトリガーされた後、私はアクションを実行する前にユーザーを自分が戻ったページにリダイレクトしたいと思います。 Playでこれを使用するには良いパターンがありますか?アクション後に前のページにリダイレクトするためのパターン

+0

refererをrequest.getHeader経由で取得し、フラッシュまたはセッションのいずれかに格納するよりも優れたものをお探しですか?私はより良い方法についても聞くことに興味があります。更新:ちょうどあなたがスカラについて尋ねたことを理解しました。 –

+0

@alihaider私は以下で使用したソリューションを貼り付けましたが、おそらく参照元を使用する方が良いでしょうか? –

+0

も参照してくださいhttp://stackoverflow.com/questions/14891988/redirect-to-referer-after-a-post-request –

答えて

2

これは私が最後に思いついたものですが、それは特に優雅ではありませんが、私はそれを行うより良い方法に興味があります。私のコントローラに続いて

@(implicit request: RequestHeader) 

... 

<form action="@routes.Controller.doStuff()" method="post"> 
    <input type="hidden" name="previousURL" value="@request.uri"/> 
    ... 
</form> 

:私は、現在のページのURLと私のフォームに隠し入力を追加

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) 
    } 
} 
4

あなたがキャンセルボタンを持っている場合は、簡単にたとえば、あなたのテンプレートで@request.getHeader("referer")を使用することができますそれは、前のページにリダイレクトする必要があり、これを使用する:

<a href="@request.getHeader("referer")">Cancel</a> 

をこの方法で、あなたのテンプレートに余分な情報を渡す必要はありません。 (遊び2.3.4でテスト済み)

1

私はこれを行うために見つけた最も簡単な方法は、お使いのコントローラのメソッド内からで、これを使用する:

を:

String refererUrl = request().getHeader("referer"); 

をので、あなたのような何かをしたいです

public static Result query(String queryStr, int page, int offset) { 
    String refererUrl = request().getHeader("referer"); 
    Logger.info("refererUrl: " + refererUrl); 
    if(queryStr.length() < 3) { 
     flash(Application.FLASH_ERROR_KEY, "type a longer search than '" + queryStr.trim() + "'"); 
     return redirect(refererUrl); 
    } 
    return ok(listings.render(searchService.searchListings(queryStr))); 
} 

フラッシュメッセージを使用してredirect()を実行し、render()を実行する必要はありません。

関連する問題