リフト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
所属していません StackOverflow