2016-04-29 8 views
2

In Grails umleitet, wenn ich so etwas tun:Grails Erhaltung Flash-Mitteilung zwischen

def someAction() { 
//....... 

flash.message = "some message" 
[:] 
} 

Dann in someAction.gsp, würde es die Flash-Nachricht angezeigt werden soll.

Aber wenn ihr etwas wie folgt aus:

def someAction() { 
// ...... 
flash.message = "some message" 

redirect uri: "${createLink(controller: 'someothercontroller', action: 'someotheraction')}" 
} 

Dann in obigen Fall in someotheraction.gsp die flash.message nicht haben.

Meine Frage ist, wie ich von someAction zu einer anderen (möglicherweise in einem anderen Controller oder gleichen Controller) weitergeben.

Ich weiß, ich kann etwas tun wie params.flash = flash.message und in der anderen Aktion verwenden Sie diese params.flash zu flash.message dort zuweisen. Bei diesem Ansatz muss ich jedoch immer alle möglichen Weiterleitungen kennen, die nicht immer passieren können.

Also gibt es einen besseren und vielleicht einen "Standard" Weg, um die Flash-Nachricht bis zur allerletzten Redirect (das gsp endlich macht) zu erhalten?

Antwort

-1

Ich habe versucht, dass einige Zeit, aber man kann das nicht tun, vielleicht sollten Sie die Nachricht in der Sitzung, so etwas wie speichern:

session.message = "your message" 

Dann haben Sie die Nachricht, wo Sie es brauchen.

+0

Aber dann bleibt die Nachricht in der gesamten Sitzung. – Armaiti

+0

Vielleicht verstehe ich nicht, was Sie brauchen, wenn Sie die Nachricht erhalten möchten, sollten Sie sie in der Sitzung speichern und sie löschen, wenn Sie wissen, dass Sie sie nicht wieder benötigen. Aber wenn Sie wollen, dass die flash.message direkt nach der Verwendung einer Weiterleitung verfügbar ist, funktioniert es gut, aber verwenden Sie Redirect auf diese Weise: Redirect (Controller: 'Somothercontroller', Aktion: 'Somotheraction').Ich würde gerne wissen, warum der negative Punkt, die Art und Weise, wie Sie die Frage stellen, so aussieht, als ob Sie die Nachricht durch viele Weiterleitungen erhalten möchten, nicht nur eine. – ingemi

1

"Es gibt ein Plugin dafür!"

Leider ein alter, aber entweder funktioniert es noch oder Sie können den Quellcode nach Inspiration durchsuchen. Es basiert auf dem Speichern der Nachricht in der Sitzung, wie von einer anderen Antwort vorgeschlagen.

One-Time Data plugin

1

Grails bewahrt Blitz zwischen Umleitungen, hier ein Beispiel:

class ExampleController { 
    def action1() { 
    flash.message = 'test' 
    redirect action: 'action2' 
    // or redirect uri: "${createLink(controller: 'example', action: 'action2')}" or any other ways 
    return 
    } 

    def action2() { 
    render text: flash.message 
    } 
} 

funktioniert perfekt und macht 'test' in action2. Vielleicht haben Sie mehrere Weiterleitungen? In diesem Fall sollten Sie Ihre Flash-Nachricht vor der nächsten Weiterleitung neu definieren.

UPD:

Mit Sitzung (einfach, aber nicht kugelsicher):

class ExampleController { 
    def action1() { 
    session.message = 'text' 
    redirect action: 'action2' 
    } 

    def action2() { 
    def msg = session?.message 
    session.message = '' 

    render text: msg 
    } 
} 

Etwas besserer Weg für Runden simultanious Anforderungen von einem Benutzer (session_id), aber nicht ideal auch:

class ExampleController { 
    def action1() { 
    session.messages = (session.messages?:[]) + ['text'] 
    redirect action: 'action2' 
    } 

    def action2() { 
    def msg = flash.messages?.get(0) 
    flash.messages?.remove(0) 

    render text: msg 
    } 
} 

Dies ist nur eine Idee, vielleicht finden Sie einen besseren Weg mit session.

+0

Ja, ich habe mehrere Weiterleitungen. Ich suchte nach einem Weg, um das zu erreichen, was ich will, ohne Flash-Nachrichten neu definieren zu müssen, da alle Weiterleitungen nicht in allen Szenarien offensichtlich sind und einige sogar nicht unter unserer Kontrolle stehen (z. B. durch ein Plugin) – rahulserver

+1

In diesem Fall ist Flash nicht für dich geeignet. Verwenden Sie Sitzung statt Flash. Aber erinnere dich nicht daran, es nach dem Lesen der letzten Aktion zu löschen. Es kann auch eine Situation mit der falschen Nachricht geben, wenn ein Benutzer mit einer einzelnen Sitzungs-ID mehrere Fenster gleichzeitig öffnet (aber das ist unwahrscheinlich). – Vladimir

+0

@rahulserver Welche Art von Lösung hast du am Ende? –