質問
Scala/Lift のスタックを独占しているような気がして申し訳ありませんが、質問が続きます。こちらが最新のものです。
/login/* 内のすべてへのアクセスを、まだログインしていないユーザーに制限しようとしています。
私がそれをやろうとしている方法は次のとおりです。
val entries = Menu(Loc("Home", List("index"), "Home")) :: //login stuff
Menu(Loc("loginBase", ("login"::""::Nil)->true, "Login Base", Hidden, anyLoggedIn))::...
それがサイトマップのエントリです。次に、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")
}
プロバイダーと学生がすでにログインしているときにログインページにアクセスしようとしたときに、それぞれの「ホーム」に送りたいと考えています。何らかの理由で (おそらく私のブール論理です)、これは決して機能せず、リダイレクトに到達することもありません。
何か案は?
ありがとう
解決
よくある間違い 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 内包表記を使用して書き直すことができます。
(for {val loginType <- sessionLoginType.is
val uri <- redirectMap.get(loginType) }
yield RedirectResponse(uri)
).open_!
ただし、次の場合は注意してください redirectMap
キーまたはあなたの sessionLoginType
空いてる、困ってるよ -- open_!
空のボックスには適用しないでください。失敗します。適切なデフォルト値がわかっている場合は、それを使用することをお勧めします。 .openOr defaultRedirect