Comment passer des données en flash du contrôleur pour afficher avec le Jeu! cadre
J'ai été labourer par le biais du jeu! jusqu'à présent, avec quelques bosses dans la courbe d'apprentissage. Droit maintenant, je suis incapable de passer de données en flash du contrôleur à la vue, au premier abord, je pensais être une tâche triviale, ou du moins il devrait l'être.
Voici ce que j'ai en ce moment:
J'ai une page principale: application.scala.html
J'ai une vue qui va dans la mise en page: login.scala.html
et j'ai mon contrôleur et méthode: UX.authenticate() - je veux ce à fournir des données en flash pour les visualiser, en fonction du résultat de la tentative de connexion (réussite vs échec)
C'est mon code dans ma méthode de contrôleur:
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())
}
}
}
Dans ma connexion, j'ai un paramètre: @(implicit flash: Flash)
Lorsque j'essaie d'utiliser le flash rien ne s'affiche à l'aide de @flash.get("message")
Idéalement, j'aimerais souhaitez définir @(implicit flash: Flash)
dans la mise en page, de sorte que je peux flash de données à partir de n'importe quel contrôleur et il va rejoindre mon point de vue. Mais à chaque fois que je fais ça, la vue login jette les erreurs.
Dans mon login vue de droite maintenant j'ai ceci:
def login = Action { implicit request =>
flash + ("message" -> "test")
Ok(views.html.ux.login(flash))
}
Quel est le moyen idéal de le passage éclair de données à la vue, et il y a des exemples partout dans le monde? Les exemples sur le Jeu! cadre docs ne pas aider que ce soit et sont limités à deux exemples qui montrent aucune interaction avec le point de vue à tous (trouvé ici en bas: http://www.playframework.com/documentation/2.0/ScalaSessionFlash).
Est-il une alternative plus facile? Ce que je fais mal? Comment puis-je passer de flash directement les données à ma disposition?
OriginalL'auteur Ron | 2013-03-20
Vous devez vous connecter pour publier un commentaire.
Si vous regardez dans la documentation de Session et Flash étendues vous allez voir cet extrait de code:
Maintenant, comparez cela à votre utilisation du flash la portée:
Le problème avec ce type d'utilisation est que flash est immuable, vous ne pouvez pas réaffecter. De plus, avec votre utilisation ici vous êtes en train de créer une nouvelle variable flash, il n'est tout simplement pas utilisé.
Si vous aviez modifié que légèrement pour devenir:
Il serait avez travaillé. Cependant, l'usage privilégié est l'utilisation de la
.flashing()
méthode sur votre résultat. Cette méthode vient de jouer.l'api.mvc.WithHeaders, un trait de caractère qui est mélangé à jouer.l'api.mvc.PlainResult qui le résultat de méthodes (Ok, Redirection, etc.) hériter de la.Ensuite, comme indiqué dans la documentation, vous pouvez accéder à la flash la portée du modèle:
edit: Ah, d'accord. J'ai examiné votre exemple de code, et maintenant je vois ce que vous essayez de faire. Je pense que vous êtes à la recherche de la manière canonique de la manipulation des soumissions de formulaires. Revoir les définitions de contraintes ici dans la documentation et je pense que vous verrez qu'il y a une meilleure façon de l'accomplir. Essentiellement, vous aurez envie d'utiliser le
verifying
méthode sur le tuple la sauvegarde de votre formulaire afin quebindFromRequest
échoue à se lier et les erreurs de validation peut être transmis à la vue:flashing()
méthode a fonctionné, mais comment pourrais-je obtenir des données en flash dans ma mise en page sans aller avoir à passer de contrôleur, de mon point de vue, alors pour ma présentation?Supposons que vous avez deux points de vue ici:
login.scala.html
etlayout.scala.html
. Vous essayez d'appelerviews.html.login(...)
à partir de votre contrôleur qui est ensuite va ressembler@layout { form stuff }
. Si vous déclarez également que vousflash
comme une variable implicite sur votre page, il sera automatiquement dans le champ d'application de la mise en page. Est-ce que vous cherchez?Presque scénario exact, j'obtiens cette erreur
'=>' expected but ')' found.
- à l'exception de votre exemple et mon installation est ma mise en page des paramètres afin delogin.scala.html
il ressemble à ceci:@layout(param) { content }
donc, à monlayout.scala.html
j'ai ceci:@(title: String)(content: Html) \n @(implicit flash: Flash)
- ce que je fais mal?Supprimé les paramètres et configurer simplement la façon dont vous l'avez dans l'exemple maintenant j'ai cette erreur:
could not find implicit value for parameter flash: play.api.mvc.Flash
Les paramètres de
layout.scala.html
devrait être@(title: String)(content: Html)(implicit flash: Flash)
. Pas de saut de ligne entre eux.OriginalL'auteur Ryan
Voulais ajouter une chose de plus à cette discussion, pour aider les gens à éviter cette erreur:
Je sais que beaucoup de ce qui est redondant, mais il y a une technicité à la fin qui a volé la moitié de ma journée et je sens que je peux aider les gens avec. Ajoutant .clignotant(/* votre flash étendue info */), tels que:
... ne définit l'implicite "flash" de la variable que vous pouvez utiliser dans votre modèle, si vous avez une "base" de modèle que vous souhaitez gérer le flash portée avec (comme des erreurs), unique l'utilisation du modèle de base est facile, puisque vous avez déjà implicite flash variable définie par .clignotant() ... C'est un exemple de l'un de mes "comprend" du modèle de base.
Vous ne pas passer le "flash" de la variable pour le modèle de base. C'est implicite. Le modèle de base reste encore à définir. Les paramètres de mon modèle de base est: est-ce
Ouais, je sais que beaucoup de ce qui est inutile, mais c'est un exemple réel, je suis à la copie n' coller à partir d'. De toute façon, il est probable que vous avez besoin de la autres modèles que l'utilisation de votre modèle de base, et vous n'utilisent pas toujours .clignotant() pour les charger. Puisque vous êtes sûrement le chargement à l'aide de Contrôleurs, si vous oubliez de commencer votre Action pour chaque avec demande implicite => tels que:
puis le "flash" implicite ne sera pas défini. Puis, quand ce modèle tente d'inclure votre modèle de base, vous serez déconcerté parce que vous n'avez pas le par défaut de flash implicite variable définie, tandis que le modèle de base exige. D'où l'erreur.
Donc encore une fois, la correction.. accédez à l'ensemble de vos méthodes de contrôleur, et assurez-vous que vous mettez dans cette demande implicite => !
OriginalL'auteur sdanzig