题
我觉得我独占堆栈斯卡拉/提升,所以我很抱歉,但问题滚滚而来。下面是最新的。
我试图限制访问到/登录什么/ *给谁尚未登录的用户。
下面是如何我试图做到这一点:
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
条件下工作时,这是很常犯的错误(我个人倾向于在底部来定义它们)。为了克服这个问题,定义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,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
不隶属于 StackOverflow