Wie übergeben Sie flash-Daten vom controller zum view mit Spielen! Rahmen
Ich habe das Pflügen durch spielen! so weit, mit ein paar Beulen in der Lernkurve. Jetzt bin ich nicht in der Lage, um pass-flash-Daten vom controller zur view, die auf den ersten ich dachte, war eine einfache Aufgabe, oder sollte es zumindest sein.
Hier ist, was ich jetzt haben:
Ich habe einen main layout: application.scala.html
Habe ich eine Ansicht, die geht in die layout -: login.scala.html
und ich habe meine controller und Methode: UX.authenticate() - ich will dies, um flash-Daten, um die Sicht je nach dem Ergebnis der login-Versuch (erfolgreich vs. nicht)
Dies ist mein code in meinen controller-Methode:
def authenticate = Action { implicit request =>
val (email, password) = User.login.bindFromRequest.get
//Validation
//-- Make sure nothing is empty
if(email.isEmpty || password.isEmpty) {
flash + ("message" -> "Fields cannot be empty") + ("state" -> "error")
Redirect(routes.UX.login())
}
//-- Make sure email address entered is a service email
val domain = email.split("@")
if(domain(1) != "example.com" || !"""(\w+)@([\w\.]+)""".r.unapplySeq(email).isDefined) {
flash + ("message" -> "You are not permitted to access this service") + ("state" -> "error")
Redirect(routes.UX.login())
} else {
//Attempt login
if(AuthHelper.login(email, password)) {
//Login successful
val user = User.findByEmail(email)
flash + ("message" -> "Login successful") + ("state" -> "success")
Redirect(routes.UX.manager()).withSession(
session + (
"user" -> user.id.toString
)
)
} else {
//Bad login
flash + ("message" -> "Login failed") + ("state" -> "error")
Redirect(routes.UX.login())
}
}
}
In meinem login, das ich einen parameter: @(implicit flash: Flash)
Wenn ich versuche mit flash nichts wird mit @flash.get("message")
Idealerweise würde ich einstellen wollen @(implicit flash: Flash)
im layout, so dass ich die flash-Daten von jedem controller und erreichen meiner Sicht. Aber wenn ich das mache, login anzeigen, wirft Fehler.
In meinem login-Ansicht jetzt habe ich dieses:
def login = Action { implicit request =>
flash + ("message" -> "test")
Ok(views.html.ux.login(flash))
}
Was ist die ideale Art der übergabe von flash-Daten, um die anzeigen, und gibt es Beispiele irgendwo? Die Beispiele auf das Spiel! framework-docs helfen nicht immer und sind nur zwei Beispiele, die zeigen, dass keine Wechselwirkung mit dem Blick auf alle (gefunden hier unten: http://www.playframework.com/documentation/2.0/ScalaSessionFlash).
Gibt es eine einfachere alternative? Was mache ich falsch? Wie kann ich pass flash-Daten direkt an meine layout-Ansicht?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie sich in der Dokumentation für Session-und Flash-Bereiche Sie werden sehen, dass dieser code-snippet:
Nun vergleichen Sie das, um Ihre Nutzung der flash-Bereich:
Das Problem mit dieser Nutzung ist, dass flash ist unveränderlich, Sie können nicht zuweisen. Zudem ist Ihre Verwendung hier erstellen Sie tatsächlich eine neue flash-Variablen, es ist einfach nicht verwendet wird.
Wenn Sie hatte geändert, etwas zu werden:
Es würde gearbeitet haben. Allerdings ist die bevorzugte Verwendung ist die Verwendung der
.flashing()
Methode auf das Ergebnis. Diese Methode kommt aus dem Spiel.api.mvc.WithHeaders, eine Eigenschaft, die gemischt spielen.api.mvc.PlainResult, die die verschiedenen Ergebnis-Methoden (Ok, Umleitung, etc.) Erben aus.Dann, wie gezeigt, in der Dokumentation, können Sie den Zugriff auf das flash scope in Ihrer Vorlage:
edit: Ah, okay. Ich habe überprüft Ihre Beispielcode und jetzt sehe ich, was Sie zu tun versuchen. Ich denke, was Sie wirklich suchen für ist der übliche Weg, der Umgang mit Formularen. Überprüfen Sie die constraint-Definitionen hier in der Dokumentation und ich glaube, du wirst sehen, es gibt einen besseren Weg, dies zu erreichen. Im wesentlichen werden Sie wollen, verwenden Sie die
verifying
Methode, die auf das Tupel sichern Sie Ihre form so, dassbindFromRequest
wird scheitern, Sie zu binden und die Fehler bei der Validierung übergeben, zu der Ansicht:flashing()
Methode funktioniert, aber wie bekomme ich flash-Daten in mein layout ohne dass es pass von der Steuerung bis mein Blick dann zu meinem layout?login.scala.html
undlayout.scala.html
. Sie versuchen zu rufenviews.html.login(...)
von Ihrem controller die dann Aussehen@layout { form stuff }
. Wenn Sie auch erklärenflash
als implizite variable auf Ihrem layout-Ansicht, wird diese automatisch im Rahmen in Ihrem layout. Ist es das, was du suchst?'=>' expected but ')' found.
- die Ausnahme, die durch Ihr Beispiel und mein setup ist mein layout-Parameter so auslogin.scala.html
sieht es wie folgt aus:@layout(param) { content }
also in meinemlayout.scala.html
habe ich dieses:@(title: String)(content: Html) \n @(implicit flash: Flash)
- was mache ich hier falsch?could not find implicit value for parameter flash: play.api.mvc.Flash
layout.scala.html
sollte@(title: String)(content: Html)(implicit flash: Flash)
. Kein Zeilenumbruch zwischen Ihnen.could not find implicit value for parameter flash: play.api.mvc.Flash
aus login.scala.html bei@layout("Login") {
Hinzufügen wollte noch eine Sache zu dieser Diskussion, Menschen zu helfen, vermeiden Sie diese Fehler:
Ich weiß, dass viele dieser redundant ist, aber es gibt eine Formsache, am Ende gestohlen hat, der die Hälfte von meinem Arbeitstag und ich glaube, ich kann Menschen helfen, mit. Anhängen .blinken(/* Ihre flash-scoped-Infos */), wie:
... hat definiert das implizite "flash" - variable, die Sie verwenden können, in Ihrer Vorlage, wenn Sie eine "Basis" - Vorlage, die Sie behandeln möchten-flash-Bereich (z.B. Fehler), single Nutzung der Basis-Vorlage ist einfach, da Sie bereits implizit die flash-variable definiert über .blinken() ... Dies ist ein Beispiel von einem meiner "enthält", der eine Basis-Vorlage.
Tun Sie nicht zu Durchlaufen haben, der "flash" - variable auf der Vorlage basieren. Es ist eine implizite. Die Basis-Vorlage noch hat, es zu definieren. Die Parameter für meine Basis-template ist das:
Yeah, ich kenne viele, die unnötig ist, aber dies ist ein reales Beispiel bin ich mit copy n' Paste aus. Trotzdem, es ist wahrscheinlich, dass Sie brauchen, um zu haben anderen Vorlagen, die mit Ihrem Basis-Vorlage, und Sie nicht immer verwenden .blinken (), um diese zu laden. Da bist du sicher verladen diese mit Hilfe eines Controllers, wenn Sie vergessen haben, starten Sie Ihre Aktion für jeden mit implicit request => wie:
dann die "flash" implizite nicht definiert werden. Dann, wenn die Vorlage versucht, Ihre Basis-Vorlage, werden Sie flummoxed, weil Sie nicht über die Standard-flash - implizite variable definiert, während die Basis-Vorlage es verlangt. Daher auch die Fehlermeldung.
Also nochmal, das Update.. geh auf alle Ihre controller-Methoden und stellen Sie sicher, Sie setzen in, dass implizite request => !