Se i valori in Boot.scala (Scala Lift)
Domanda
Mi sento come se fossi monopolizzare lo stack per Scala / ascensore, quindi mi scuso, ma le domande continuano ad arrivare. Ecco l'ultima.
Sto cercando di limitare l'accesso a qualsiasi cosa in / login / * a quegli utenti che non hanno ancora effettuato l'accesso.
Ecco come sto cercando di farlo:
val entries = Menu(Loc("Home", List("index"), "Home")) :: //login stuff
Menu(Loc("loginBase", ("login"::""::Nil)->true, "Login Base", Hidden, anyLoggedIn))::...
Questo è la voce nella mappa del sito. Poi mi definisco anyLoggedIn in Boot.scala in questo modo:
val anyLoggedIn = If(() => !(Student.loggedIn_? || Provider.loggedIn_?),
if (sessionLoginType.is map {_ == StudentLogin} openOr false)
{
println("student")
RedirectResponse("studentHome")
}
else
{
println("provider")
RedirectResponse("providerHome")
}
Voglio inviare i fornitori e gli studenti a loro "case", rispettivamente, quando cercano di accedere a qualsiasi pagina di login quando sono già registrati nel. Per qualche motivo, (forse il suo mia logica booleana), non funziona mai, ed io mai rendere al redirect.
Tutte le idee?
Grazie
Soluzione
Errore commune con val
è quello di definire una variabile dopo l'uso:
scala> object test {
| val f = x
| val x = 1
| }
defined module test
scala> println(test.f)
0
Il che è abbastanza spesso errore quando si lavora con le condizioni di SiteMap
di sollevamento (io personalmente tendo a definirli in basso). Per ovviare a questo, definire il val
come lazy
:
scala> object test {
| val f = x
| lazy val x = 1
| }
defined module test
scala> println(test.f)
1
Nota a margine
Il secondo test in If
non sembra troppo Scalaish, è un mix di stili funzionali e procedurali. Ci sono opzioni su come scrivere, si prega di vedere solo una possibile variante:
sessionLoginType.is match {
case Full(StudentLogin) =>
println("student")
RedirectResponse("studentHome")
case Full(ProviderLogin) =>
println("provider")
RedirectResponse("providerHome")
}
Un'altra opzione
È possibile definire una mappa statica dal tipo di accesso a uri, per es.
val redirectMap = Map(StudentLogin -> "studentHome", ProviderLogin -> "providerHome")
Quindi è possibile utilizzare nel vostro If
come
sessionLoginType.is.flatMap{ redirectMap.get }.map{ RedirectResponse _ }.open_!
lo stesso può essere riscritto utilizzando per-comprehensions:
(for {val loginType <- sessionLoginType.is
val uri <- redirectMap.get(loginType) }
yield RedirectResponse(uri)
).open_!
Ma attenzione, se redirectMap
non contiene una chiave o il vostro sessionLoginType
è vuota, si è in difficoltà - open_!
fallirà, in quanto non dovrebbe essere applicato a scatole vuote. Se conoscete un valore predefinito ragionevole, migliore utilizzo .openOr defaultRedirect