إذا كانت القيم في boot.scala (رفع 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 في 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
لا يبدو scalaish للغاية ، إنه مزيج من الأساليب الوظيفية والإجرائية. هناك خيارات حول كيفية كتابتها ، يرجى الاطلاع على متغير واحد فقط:
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 {val loginType <- sessionLoginType.is
val uri <- redirectMap.get(loginType) }
yield RedirectResponse(uri)
).open_!
لكن احذر إذا redirectMap
لا يحتوي على مفتاح أو الخاص بك sessionLoginType
فارغ ، أنت في ورطة - open_!
سوف تفشل ، لأنه لا ينبغي تطبيقه على الصناديق الفارغة. إذا كنت تعرف قيمة افتراضية معقولة ، فاستخدم بشكل أفضل .openOr defaultRedirect