تخزين متغيرات الجلسة في LIFT Scala
سؤال
أحاول تخزين متغير جلسة ثم استخدامه لتعديل القائمة في boot.scala. إليكم كيف أقوم بتخزين المتغير في مقتطف:
object sessionUserType extends SessionVar[String](null)
def list (xhtml : NodeSeq) : NodeSeq = {
Helpers.bind("sendTo", xhtml,
"provider" -> SHtml.link("/providerlogin",() => sessionUserType("provider"), Text("Provider")),
"student" -> SHtml.link("/studentlogin",() => sessionUserType("student"), Text("Student")))
}
ثم في boot.scala أفعل هذا:
val studentSessionType = If(() => S.getSessionAttribute("sessionUserType").open_!.equals("student"),
"not a student session")
حاولت أيضًا الاتصال بالكائن بالاسم (SessionUserType) ، لكن لا يمكن أن تجده أبدًا ، لذلك اعتقدت أن هذا قد ينجح ، لكنني أستمر في الحصول على مربع فارغ عند الوصول إليه على الرغم من تنفيذ الربط الفعلي والوظيفة قبل عرض القائمة.
أي مساعدة سيكون محل تقدير كبير.
شكرًا
المحلول
من أجل الحصول على قيمة من SessionVar
أو RequestVar
, ، يتصل is
طريقة على ذلك ، أي sessionUserType.is
بالمناسبة ، هل قرأت "إدارة الدولة"?
ملاحظة جانبية
أعتقد RequestVar
هو أفضل في حالتك. لست متأكدًا من أنه يمكنني التقاط الكود الخاص بك مباشرة بدون السياق ، ولكن يمكن إعادة كتابته على الأقل مثل:
case class LoginType
case object StudentLogin extends LoginType
case object ProviderLogin extends LoginType
object loginType extends RequestVar[Box[LoginType]](Empty)
// RequestVar is a storage with request-level scope
...
"provider" -> SHtml.link("/providerlogin",() => loginType(Full(ProviderLogin)), Text("Provider")),
// `SHtml.link` works in this way. Your closure will be called after a user
// transition, that is when /providerlogin is loading.
...
val studentSessionType = If(() => { loginType.is map {_ == StudentLogin} openOr false },
"not a student session")
// As a result, this test will be true if our RequestVar holds StudentLogin,
// but it will be so for one page only (/studentlogin I guess). If you want
// scope to be session-wide, use SessionVar
نصائح أخرى
أعتقد أن الانفصال هو أنك تفترض أن أ سمة الجلسة سوف تتطابق مع Sessionvar, ، وهذا ليس هو الحال. المصعد جدا يؤمن الإطار ، وواحد إذا كانت ميزاته هي أن المصعد يخلق Guids غير شفاف للإشارة إلى المكونات على جانب الخادم.
إن أردت getSessionAttribute
لإعادة شيء ما ، فكر في كيفية الاتصال setSessionAttribute
.