2013-07-01 3 views
8

내 Play 앱에서 여러 페이지에서 트리거 될 수있는 여러 가지 작업 (예 : 항목을 '삭제')이 있습니다. 작업이 실행 된 후에 사용자가 작업을 수행하기 전의 페이지로 리디렉션하고 싶습니다. Play에서이를 위해 사용할 수있는 좋은 패턴이 있습니까?동작 후 이전 페이지로 리디렉션하는 패턴

+0

request.getHeader를 통해 referer를 검색하고 플래시 또는 세션에 저장하는 것보다 나은 것을 찾고 있습니까? 나는 더 나은 방법에 대해서도 듣고 싶어합니다. 업데이트 : 방금 스칼라에 대해 물었다는 것을 깨달았습니다. –

+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()가 필요하다는 점에 유의하십시오.

관련 문제