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

War es hilfreich?

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

kennen
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top