Si les valeurs dans Boot.scala (Scala Lift)
Question
Je sens que je suis monopolisant la pile pour Scala / Lift, je présente mes excuses, mais les questions continuent d'affluer. Voici les dernières nouvelles.
Je suis en train de restreindre l'accès à quoi que ce soit dans le répertoire / login / * aux utilisateurs qui ne sont pas encore connectés.
Voici comment je suis en train de le faire:
val entries = Menu(Loc("Home", List("index"), "Home")) :: //login stuff
Menu(Loc("loginBase", ("login"::""::Nil)->true, "Login Base", Hidden, anyLoggedIn))::...
Cest l'entrée dans SiteMap. Ensuite, je définis anyLoggedIn dans Boot.scala comme ceci:
val anyLoggedIn = If(() => !(Student.loggedIn_? || Provider.loggedIn_?),
if (sessionLoginType.is map {_ == StudentLogin} openOr false)
{
println("student")
RedirectResponse("studentHome")
}
else
{
println("provider")
RedirectResponse("providerHome")
}
Je veux envoyer les fournisseurs et les étudiants à leurs « maisons » respectivement, lorsqu'ils tentent d'accéder à une page de connexion quand ils sont déjà connectés. Pour une raison quelconque, (peut-être sa ma logique booléenne), ça ne marche jamais, et je jamais faire les réoriente.
Des idées?
Merci
La solution
Erreur commune avec val
est de définir une variable après l'utilisation:
scala> object test {
| val f = x
| val x = 1
| }
defined module test
scala> println(test.f)
0
Ce qui est assez souvent erreur lorsque vous travaillez avec des conditions de SiteMap
de Lift (je tends personnellement à les définir dans le fond). Pour y remédier, définir votre val
comme lazy
:
scala> object test {
| val f = x
| lazy val x = 1
| }
defined module test
scala> println(test.f)
1
Side note
Votre deuxième test en If
ne semble pas trop Scalaish, il est un mélange de styles fonctionnels et de procédure. Il y a des options sur la façon de l'écrire, s'il vous plaît voir simplement une variante possible:
sessionLoginType.is match {
case Full(StudentLogin) =>
println("student")
RedirectResponse("studentHome")
case Full(ProviderLogin) =>
println("provider")
RedirectResponse("providerHome")
}
Une autre option
Vous pouvez définir une carte statique du type de connexion à uri, par exemple.
val redirectMap = Map(StudentLogin -> "studentHome", ProviderLogin -> "providerHome")
Ensuite, vous pouvez l'utiliser dans votre If
comme
sessionLoginType.is.flatMap{ redirectMap.get }.map{ RedirectResponse _ }.open_!
la même chose peut être réécrite en utilisant pour-compréhensions:
(for {val loginType <- sessionLoginType.is
val uri <- redirectMap.get(loginType) }
yield RedirectResponse(uri)
).open_!
Mais attention, si redirectMap
ne contient pas de clé ou votre sessionLoginType
est vide, vous êtes en difficulté - open_!
échouera, car il ne doit pas être appliqué à des boîtes vides. Si vous connaissez une valeur par défaut raisonnable, une meilleure utilisation .openOr defaultRedirect