2

Scala/Liftのスタックを独り占めしているような気がして申し訳ないのですが、質問が相次ぎます。これが最新です。

/login/* 内のすべてへのアクセスを、まだログインしていないユーザーに制限しようとしています。

これが私がそれをやろうとしている方法です:

val entries = Menu(Loc("Home", List("index"), "Home")) ::  //login stuff
    Menu(Loc("loginBase", ("login"::""::Nil)->true, "Login Base", Hidden, anyLoggedIn))::...

それが SiteMap のエントリです。次に、次のように Boot.scala で anyLoggedIn を定義します。

val anyLoggedIn  = If(() => !(Student.loggedIn_? || Provider.loggedIn_?), 
            if (sessionLoginType.is map {_ == StudentLogin} openOr false)
            {
                println("student")
                RedirectResponse("studentHome")

            }
            else 
            {
                println("provider")
                RedirectResponse("providerHome")
            }

プロバイダーと学生がすでにログインしているときにログインページにアクセスしようとすると、プロバイダーと学生をそれぞれ「ホーム」に送りたいと思います。何らかの理由で(おそらく私のブール論理)、機能せず、作成しませんリダイレクトに。

何か案は?

ありがとう

4

1 に答える 1

2

よくある間違い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

サイドノート

の2番目のテストは、Ifあまりスカラッシュに見えません。機能的なスタイルと手続き的なスタイルが混在しています。それを書く方法についてのオプションがあります、ただ1つの可能な変形を見てください:

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

于 2009-10-11T07:00:55.753 に答える