2013-07-01 4 views
8

मेरे Play ऐप में, मेरे पास कई क्रियाएं हैं (उदा। "एक इकाई" हटाएं) जिसे विभिन्न पृष्ठों से ट्रिगर किया जा सकता है। कार्रवाई ट्रिगर होने के बाद, मैं कार्रवाई को करने से पहले उपयोगकर्ता को उस पृष्ठ पर वापस रीडायरेक्ट करना चाहता हूं, जिस पर वे थे। क्या Play में इसका उपयोग करने के लिए कोई अच्छा पैटर्न है?एक क्रिया के बाद पिछले पृष्ठ पर रीडायरेक्ट करने के लिए पैटर्न

+0

क्या आप रेफरर को 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))); 
} 

ध्यान रखें कि आपको एक फ्लैश संदेश के साथ रीडायरेक्ट() और रेंडर() नहीं करना चाहिए।

संबंधित मुद्दे