Se valores em boot.scala (elevador Scala)
Pergunta
Sinto que estou monopolizando a pilha de Scala/Lift, então peço desculpas, mas as perguntas continuam chegando. Aqui está o mais recente.
Estou tentando restringir o acesso a qualquer coisa no /Login /* aos usuários que ainda não fizeram login.
Aqui está como estou tentando fazer isso:
val entries = Menu(Loc("Home", List("index"), "Home")) :: //login stuff
Menu(Loc("loginBase", ("login"::""::Nil)->true, "Login Base", Hidden, anyLoggedIn))::...
Essa é a entrada no sitemap. Então eu defino AnyLoggedin em boot.scala como assim:
val anyLoggedIn = If(() => !(Student.loggedIn_? || Provider.loggedIn_?),
if (sessionLoginType.is map {_ == StudentLogin} openOr false)
{
println("student")
RedirectResponse("studentHome")
}
else
{
println("provider")
RedirectResponse("providerHome")
}
Quero enviar provedores e alunos para suas "casas", respectivamente, quando tentam acessar qualquer página de login quando já estão conectadas. Por algum motivo (talvez seja minha lógica booleana), ela nunca funciona, e eu nunca o faço para os redirecionamentos.
Alguma ideia?
Obrigado
Solução
Erro comum com val
é definir uma variável após o uso:
scala> object test {
| val f = x
| val x = 1
| }
defined module test
scala> println(test.f)
0
O que é bastante erro ao trabalhar com o elevador SiteMap
Condições (eu pessoalmente tendem a defini -las no fundo). Para superar isso, defina seu val
Como lazy
:
scala> object test {
| val f = x
| lazy val x = 1
| }
defined module test
scala> println(test.f)
1
Nota
Seu segundo teste em If
Não parece muito escalado, é uma mistura de estilos funcionais e processuais. Existem opções sobre como escrevê -lo, consulte apenas uma possível variante:
sessionLoginType.is match {
case Full(StudentLogin) =>
println("student")
RedirectResponse("studentHome")
case Full(ProviderLogin) =>
println("provider")
RedirectResponse("providerHome")
}
Outra opção
Você pode definir um mapa estático do tipo de login para URI, por exemplo,
val redirectMap = Map(StudentLogin -> "studentHome", ProviderLogin -> "providerHome")
Então você pode usá -lo em seu If
Curti
sessionLoginType.is.flatMap{ redirectMap.get }.map{ RedirectResponse _ }.open_!
O mesmo pode ser reescrito usando para compreensões:
(for {val loginType <- sessionLoginType.is
val uri <- redirectMap.get(loginType) }
yield RedirectResponse(uri)
).open_!
Mas cuidado, se redirectMap
não contém uma chave ou seu sessionLoginType
está vazio, você está com problemas - open_!
falhará, pois não deve ser aplicado a caixas vazias. Se você conhece um valor padrão razoável, melhor use .openOr defaultRedirect