Если значения в Boot.scala (Scala Lift)
Вопрос
У меня такое ощущение, что я монополизирую стек Scala/Lift, поэтому прошу прощения, но вопросы продолжают поступать.Вот последние новости.
Я пытаюсь ограничить доступ ко всему в /login/* тем пользователям, которые еще не вошли в систему.
Вот как я пытаюсь это сделать:
val entries = Menu(Loc("Home", List("index"), "Home")) :: //login stuff
Menu(Loc("loginBase", ("login"::""::Nil)->true, "Login Base", Hidden, anyLoggedIn))::...
Это запись в SiteMap.Затем я определяю AnyLoggedIn в Boot.scala следующим образом:
val anyLoggedIn = If(() => !(Student.loggedIn_? || Provider.loggedIn_?),
if (sessionLoginType.is map {_ == StudentLogin} openOr false)
{
println("student")
RedirectResponse("studentHome")
}
else
{
println("provider")
RedirectResponse("providerHome")
}
Я хочу отправлять поставщиков услуг и студентов в их «дома» соответственно, когда они пытаются получить доступ к любой странице входа в систему, когда они уже вошли в систему.По какой-то причине (возможно, это моя логическая логика) это никогда не работает, и я никогда не дохожу до перенаправлений.
Есть идеи?
Спасибо
Решение
Распространенная ошибка с val
заключается в определении переменной после использования:
scala> object test {
| val f = x
| val x = 1
| }
defined module test
scala> println(test.f)
0
Что довольно часто допускают ошибки при работе с Lift'ами. SiteMap
условия (я лично склонен определять их внизу).Чтобы преодолеть это, определите свой val
как lazy
:
scala> object test {
| val f = x
| lazy val x = 1
| }
defined module test
scala> println(test.f)
1
Примечание
Ваш второй тест в If
не выглядит слишком масштабно, это смесь функционального и процедурного стилей.Есть варианты, как это написать, посмотрите только один возможный вариант:
sessionLoginType.is match {
case Full(StudentLogin) =>
println("student")
RedirectResponse("studentHome")
case Full(ProviderLogin) =>
println("provider")
RedirectResponse("providerHome")
}
Другой вариант
Вы можете определить статическую карту типа входа в uri, например.
val redirectMap = Map(StudentLogin -> "studentHome", ProviderLogin -> "providerHome")
Затем вы можете использовать его в своем If
нравиться
sessionLoginType.is.flatMap{ redirectMap.get }.map{ RedirectResponse _ }.open_!
то же самое можно переписать, используя for-comprehensions:
(for {val loginType <- sessionLoginType.is
val uri <- redirectMap.get(loginType) }
yield RedirectResponse(uri)
).open_!
Но будьте осторожны, если redirectMap
не содержит ключа или вашего sessionLoginType
пусто, ты в беде -- open_!
не удастся, так как его не следует применять к пустым полям.Если вы знаете разумное значение по умолчанию, лучше используйте .openOr defaultRedirect