2012-02-10 163 views
4

我想从用户类转换用户ID并将其存储在播放!会话变量。但是,当我尝试打印出该会话变量时,它将返回一个空白字符串。这是一个简单的认证。斯卡拉长转换为字符串打印空白

在认证过程:在播放

session += "userid" -> user.id.toString 

打印会话变量!阶视图:

@ctx("userid") 

整个认证DEF:

def authenticate(login:LoginAttempt) = { 
      println("in authenticate") 
     User.authenticate(login.username, login.password) match { 
      case Some(user:User) => { 
       session += "username" -> user.emailAddress 
       session += "userid" -> user.id.toString 
       session += "name" -> user.name 
      session += "accounts" -> user.accounts.toString 
       Redirect(session("path").getOrElse("/")) 
      } 
      case _ => { 
       flash += "error" -> "Wrong username or password." 
       Action(Authentication.login) 
      } 
     } 
    } 

和用户类:

case class User(
    val id: Long, 

溶液?这里有什么缺失或出错,阻止user.id被存储在会话中?谢谢

+0

即使我确定在发布之前确认了所有内容,但它似乎是一个初始化错误:您初始化了会话吗?你使用它之前初始化用户ID? 否则我不会看到什么会改变一个'长'与'字符串' – 2012-02-10 17:07:48

+0

正确的两个都已初始化,我可以验证bc我有权访问字符串,如我在会话中存储的用户名。我唯一的猜测是我错过了游戏的“特色”!会话变量。 – crockpotveggies 2012-02-10 18:01:03

+0

事实上,我现在有一个与liftweb相同的问题,但是,它与'SessionVar'一起使用,但不与'RequestVar'一起使用。 – 2012-02-10 18:03:48

回答

3

在问及周围并做了更多的阅读之后,这确实是由Play的“特性”造成的! 1.2.4框架。幸运的是,我们可以期待v2更多。

对于我们特定的应用程序,当涉及到会话变量时,有第三个经常被忽视的步骤。您需要为每个人提供renderArgs才能访问。所以@ChrisJamesC的评论大多是正确的:在初始化中缺少一个步骤。

这里是发生了什么事在我们Secure.scala控制器:

(session("userid"), session("username"), session("name"), session("accounts")) match { 
      case (Some(userid), Some(username), Some(name), Some(accounts)) => { 
       renderArgs += "userid" -> userid 
       renderArgs += "username" -> username 
       renderArgs += "name" -> name 
         renderArgs += "accounts" -> accounts 
       Continue 
      } 
      case _ => { 
       session += "path" -> Request.current().path 
       Action(Authentication.login) 
      } 
     } 

就我自己来说,我没有意识到我需要renderArgs为可变我要存储和访问的会话。但有一个问题:你仍然需要将每个var存储为一个String。

然后在每次玩!查看我可以像这样访问var:@ctx("userid")

我希望这有助于未来使用Play的人!

相关问题