如何在Play(Scala)

时间:2016-05-16 12:49:40

标签: scala playframework

我是使用Scala的Play Framework新手。我想评估一个条件,并且在那个条件下评估为true,我想发送一个响应并在那时退出。但是,我正在尝试的下面的代码一直持续到最后。

我尝试用return语句打破 - 但是,我得到了类型不匹配。有人可以帮我解决这个问题吗?

def hello = Action { request =>

    if (true) {
      Ok("in If")

      // Return at this point
    }

    print("This line should not be printed")
    Ok("final") 
}

修改

假设正在使用4个参数进行GET调用 - nameagemarriedspouse。我想确保传入所有3个参数(nameagemarried),如果married为真,请检查spouse是否通过如果此验证失败,我想回复说Bad Request。否则,继续逻辑。我怎么写这个?

4 个答案:

答案 0 :(得分:1)

以下是另一种方法:

case class QueryInput(name: String, age: Int, married: Boolean, spouse: Option[String]) {
  def validated = if(married && spouse.isEmpty) None else Some(this)
}

def validateInput(request: RequestHeader) = {
  val input = for {
    name <- request.queryString.get("name").flatMap(_.headOption)
    age  <- request.queryString.get("age").flatMap(_.headOption.flatMap(a=>Try(a.toInt).toOption))
    married <- request.queryString.get("married").flatMap(_.headOption.map(_=="true"))
  } yield {
    QueryInput(name, age, married, request.queryString.get("spouse").flatMap(_.headOption))
  }

  input.flatMap(_.validated)
}

def hello() = Action { request =>
  validateInput(request) match {
    case Some(input) => Ok(input.toString())
    case None => BadRequest
  }
}

事实上,有很多选择。您还可以使用Either类进行验证:左值可累积错误并返回错误请求,右值可构建已验证的输入。

答案 1 :(得分:0)

我的建议是有一个验证参数的方法。然后执行一个简单的if / else来检查参数是否有效并返回成功或一般错误。

如果你真的想要一个特定的

答案 2 :(得分:0)

你可以这样做,通过返回Ok,但实际上,这不是scala方式。你想要做的是改变你的思维方式,把一切都想象成一个功能。如果你不知道,if-then-else总是返回一个值。例如,您实际上可以这样写:

def hello = Action { request =>
  val result = if (true) {
    Ok("foo")
  } else {
    Ok("bar")
  }

  result
}

当然,更加scala的方式是使用匹配器

def hello = Action { request =>
  val result = true match {
    case true => Ok("foo")
    case _ => Ok("bar")
  }

  result
}

更进一步,你根本不需要指定结果对象,因为scala根据返回/创建的最后一个对象计算出返回的对象。

def hello = Action { request =>
  true match {
    case true => Ok("foo")
    case _ => Ok("bar")
  }
}

编辑:要回答OP的编辑,您仍然希望使用匹配器。假设你的vals是选项,那么你会做什么:

def hello(nameOpt:Option[String], ageOpt:Option[String], marriedOpt:Option[String]) = Action { request =>
  (nameOpt, ageOpt, marriedOpt) match {
    case (Some(name), Some(age), Some(married)) => Ok("all 3 are given")
    case (Some(name), Some(age), _) => Ok("all 2 are given")
    // functionally same as above
    // case (Some(name), Some(age), None) => Ok("all 2 are given") 

    // some combination of the above
    case (None, None, Some(married)) => Ok("married but no name or age")

    // default case
    case _ => Ok("bar")
  }
}

答案 3 :(得分:0)

第一件事:

  

当块计算时,它的所有表达式和声明按顺序处理,然后块返回最后一个表达式的值作为它自己的值。

第二:don't use return

第三个是Play Framework解决问题的方法:action composition。虽然我不会说这是微不足道的。