Speichern von Sitzungsvariablen in Aufzug Scala
Frage
Ich versuche, ein Session-Variable zu speichern und dann verwenden, um das Menü in Boot.scala zu ändern. Hier ist, wie ich die Variable in einem Snippet an Speicherung:
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")))
}
Dann in Boot.scala ich dies tun:
val studentSessionType = If(() => S.getSessionAttribute("sessionUserType").open_!.equals("student"),
"not a student session")
Ich habe auch versucht, namentlich das Objekt zu nennen (sessionUserType), aber es kann es nie finden, so dass ich dachte, dies könnte Arbeit, aber ich halte ein leeres Feld bekommen, wenn ich es selbst zugreifen, obwohl die tatsächliche Bindung und Funktion erhält ausgeführt vor dem Menü-Rendering.
Jede Hilfe wäre sehr willkommen.
Danke
Lösung
Um einen Wert von SessionVar
oder RequestVar
, Call is
Methode auf, es zu erhalten, das heißt sessionUserType.is
Übrigens, haben Sie gelesen " Verwalten von Staats " / p>
Side Hinweis:
Ich glaube, RequestVar
ist eine bessere Passform in Ihrem Fall. Ich bin nicht sicher, könnte ich Ihren Code direkt ohne den Kontext fangen, aber es könnte zumindest wie folgt umgeschrieben werden:
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
Andere Tipps
Ich denke, die trennen ist, dass man davon aus, dass die eine Session Attribut wird Ihre SessionVar passen, und das nicht der Fall ist. Lift ist ein sehr sicherer Rahmen, und ein, wenn seine Funktionen sind, dass Lift schafft opaque GUIDs zu Komponenten auf der verweisen Server-Seite.
Wenn Sie getSessionAttribute
zu Rückkehr etwas wollen, darüber nachzudenken, wie man setSessionAttribute
nennen kann.