Wenn die Werte in Boot.scala (Scala Aufzug)
Frage
Ich fühle mich wie ich den Stapel für Scala / Aufzug monopolisieren, so entschuldige ich mich, aber die Fragen immer wieder kommen. Hier ist die neueste.
Ich versuche, den Zugang zu etwas zu beschränken in dem / login / * für diejenigen Nutzer, die noch nicht angemeldet.
Hier ist, wie ich versuche, es zu tun:
val entries = Menu(Loc("Home", List("index"), "Home")) :: //login stuff
Menu(Loc("loginBase", ("login"::""::Nil)->true, "Login Base", Hidden, anyLoggedIn))::...
Das ist der Eintrag in SiteMap. Dann definiere ich anyLoggedIn in Boot.scala etwa so:
val anyLoggedIn = If(() => !(Student.loggedIn_? || Provider.loggedIn_?),
if (sessionLoginType.is map {_ == StudentLogin} openOr false)
{
println("student")
RedirectResponse("studentHome")
}
else
{
println("provider")
RedirectResponse("providerHome")
}
Ich möchte jeweils auf ihre „Häuser“ Anbieter und Studenten schicken, wenn sie versuchen, eine Login-Seite zuzugreifen, wenn sie bereits angemeldet sind. Aus irgendeinem Grund (vielleicht seine meine Booleschen Logik), es funktioniert nie, und ich es nie schaffen, um die Umleitungen.
Irgendwelche Ideen?
Danke
Lösung
Häufiger Fehler mit val
ist eine Variable nach der Anwendung zu definieren:
scala> object test {
| val f = x
| val x = 1
| }
defined module test
scala> println(test.f)
0
Welche ziemlich oft Fehler sind, wenn sie mit Aufzug des SiteMap
Bedingungen arbeiten (ich persönlich tendiere sie im Boden definieren). Um dies zu überwinden, definieren Sie Ihre val
als lazy
:
scala> object test {
| val f = x
| lazy val x = 1
| }
defined module test
scala> println(test.f)
1
Side Hinweis:
Ihr zweiter Test in If
sieht nicht allzu Scalaish, es ist eine Mischung aus funktionalen und verfahrens Stilen. Es gibt Möglichkeiten, wie es zu schreiben, finden Sie nur eine mögliche Variante:
sessionLoginType.is match {
case Full(StudentLogin) =>
println("student")
RedirectResponse("studentHome")
case Full(ProviderLogin) =>
println("provider")
RedirectResponse("providerHome")
}
Eine weitere Option
Sie können eine statische Karte von Login-Typ zu uri definieren, z.
val redirectMap = Map(StudentLogin -> "studentHome", ProviderLogin -> "providerHome")
Dann können Sie es in Ihrem If
verwenden wie
sessionLoginType.is.flatMap{ redirectMap.get }.map{ RedirectResponse _ }.open_!
kann gleich neu geschrieben werden, indem für-Comprehensions:
(for {val loginType <- sessionLoginType.is
val uri <- redirectMap.get(loginType) }
yield RedirectResponse(uri)
).open_!
Aber Vorsicht, wenn redirectMap
enthält keinen Schlüssel oder Ihr sessionLoginType
leer ist, Sie sind in Schwierigkeiten - open_!
fehl, da es nicht angewendet werden sollte Boxen zu leeren. Wenn Sie einen vernünftigen Standardwert, eine bessere Nutzung .openOr defaultRedirect