我觉得我独占堆栈斯卡拉/提升,所以我很抱歉,但问题滚滚而来。下面是最新的。

我试图限制访问到/登录什么/ *给谁尚未登录的用户。

下面是如何我试图做到这一点:

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

与电梯的SiteMap条件下工作时,这是很常犯的错误(我个人倾向于在底部来定义它们)。为了克服这个问题,定义vallazy

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,e.g静态地图。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top