Request.session.get(String)返回Option [String]如何使用它?

时间:2013-03-15 10:55:09

标签: scala pattern-matching session-variables

我想在模式匹配中使用会话值但是因为我的request.get(“profileType”)返回Option [String]我不能像我在代码中那样在模式匹配中使用它。 这是我的代码片段。

def editorProfile = Action { implicit request =>
request.session.get("profileType").toString() match {
  case "editor" => {
      request.session.get("userEmail").map {
        userEmail => Ok(html.profile.editorProfile("my profile"))
      }.getOrElse {
        Unauthorized(html.error("Not logged in"))
      }
  }
 }
}

这是错误:

[MatchError: Some(editor) (of class java.lang.String)]

我的问题是。如何在模式匹配中使用session.get中的Some(编辑器)?

2 个答案:

答案 0 :(得分:2)

您在toString上致电Option[String]并获取"Some(editor)"。相反,你必须匹配:

request.session.get("profileType") match {
  case Some("editor") => { /* your code */}
  case _ => /* something else */ 
}

请注意,我添加了默认案例_ =>。如果没有它,如果MatchError不包含“profileType”属性或属性具有其他值,则可以获得session

答案 1 :(得分:2)

您应该尝试使用for for understanding,因为当您添加更多类似类型的检查时,它可能会更容易扩展。

val email = for {
  profileType <- request.session.get("profileType") if profileType == "editor"
  userEmail <- request.session.get("userEmail")
} yield userEmail

// email is of type Option[String] now, so we do the matching accordingly

email match {
  case m: Some => Ok(html.profile.editorProfile("my profile"))
  case None => Unauthorized(html.error("Not logged in or not an editor."))
}

你当然可以用更简洁的方式写下所有内容,但作为一个初学者,它不会更加明显。

<强>增加:

如果您希望稍后使用该邮件地址,可以将其更改为:

email match {
  case Some(address) => Ok(html.profile.editorProfileWithEmail("my profile", address))
  case None => Unauthorized(html.error("Not logged in or not an editor."))
}