부츠의 값인 경우 Scala (Scala Lift)
문제
나는 스칼라/리프트의 스택을 독점하는 것처럼 느껴지므로 사과하지만 질문은 계속옵니다. 여기에 최신이 있습니다.
/로그인 /*의 모든 것에 대한 액세스를 아직 로그인하지 않은 사용자에게 제한하려고합니다.
내가하는 방법은 다음과 같습니다.
val entries = Menu(Loc("Home", List("index"), "Home")) :: //login stuff
Menu(Loc("loginBase", ("login"::""::Nil)->true, "Login Base", Hidden, anyLoggedIn))::...
그것이 Sitemap의 항목입니다. 그런 다음 부츠에서 anyloggedin을 정의합니다.
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 's와 함께 일할 때 종종 실수입니다. 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-congrensions를 사용하여 동일하게 다시 작성할 수 있습니다.
(for {val loginType <- sessionLoginType.is
val uri <- redirectMap.get(loginType) }
yield RedirectResponse(uri)
).open_!
그러나주의하십시오 redirectMap
키나 당신의가 포함되어 있지 않습니다 sessionLoginType
비어 있고, 당신은 곤경에 처해 있습니다. open_!
빈 상자에 적용해서는 안되므로 실패합니다. 합리적인 기본값을 알고 있다면 더 나은 사용 .openOr defaultRedirect