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

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top