سؤال

أشعر أنني أحتكر المكدس لـ 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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top