如果Boot.scala中的值(Scala Lift)

时间:2009-10-10 19:17:31

标签: scala lift boot

我觉得我垄断了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")
            }

我想分别在他们已经登录时尝试访问任何登录页面时,将提供者和学生分别发送到他们的“家”。出于某种原因,(可能是我的布尔逻辑),它永远不会起作用,而我从来没有进入重定向。

任何想法?

由于

1 个答案:

答案 0 :(得分: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

旁注

你在If中的第二次测试看起来并不太像Scalaish,它是功能和程序风格的混合。有关如何编写它的选项,请参阅一个可能的变体:

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-comprehensions重写:

(for {val loginType <- sessionLoginType.is
      val uri <- redirectMap.get(loginType) }
      yield RedirectResponse(uri)
).open_!

但要注意,如果redirectMap不包含密钥或sessionLoginType为空,则表示您遇到问题 - open_!会失败,因为它不应该应用于空框。如果您知道合理的默认值,请更好地使用.openOr defaultRedirect