【问题标题】:How to define default values optional fields in play framework forms?如何在播放框架表单中定义默认值可选字段?
【发布时间】:2012-07-07 22:33:08
【问题描述】:

我正在使用 scala 2.0.2 播放框架实现一个 web api。我想提取并验证一些获取参数。为此,我使用了一个允许我定义可选字段的播放“表单”。

问题: 对于那些可选字段,如果没有传递参数,我需要定义一个默认值。 该代码旨在正确解析这三个用例:

  • /test?top=abc(错误,abc 不是整数)
  • /test?top=123(有效,top 为 123)
  • /test(有效,top为42(默认值))

我想出了以下代码:

def test = Action {
  implicit request =>

  case class CData(top:Int)

  val p = Form(
    mapping(
      "top" -> optional(number)
    )((top) => CData($top.getOrElse(42))) ((cdata:CData) => Some(Some(cdata.top)))
  ).bindFromRequest()

  Ok("all done.")
}

代码有效,但绝对不优雅。为了为缺少的请求参数设置默认值,有很多样板。

任何人都可以提出一个更清洁、更简洁的解决方案吗?

【问题讨论】:

    标签: scala playframework playframework-2.0


    【解决方案1】:

    这是验证查询字符串参数的路由器作业。只需在 routes 文件中定义您的参数:

    GET /test controllers.Application.test(top: Int ?= 42)
    

    并将top 作为参数添加到您的控制器方法中:

    def test(top: Int) = Action {
      // Use top here
      val data = CData(top)
    }
    

    然后,Play 会为您完成所有验证工作。请注意如何使用?= 语法指定默认值。

    您应该只对 POST 请求使用表单。

    更新:

    如果你想手动检查参数,那么你可以定义辅助方法:

    def getQueryParam(key: String, default: String)(implicit request: RequestHeader) =
      request.queryString.get(key).flatMap(_.headOption).getOrElse(default)
    

    并在你的控制器方法中使用它:

    def test = Action { implicit request =>
      val top = getQueryParam("top", "42")
      ...
    

    但是这样做会丢失类型检查。当然,您可以为每种类型定义助手,即getIntParamgetStringParam 等,但 Play 已经包含安全路由器实现,旨在解决此类问题。我建议你使用路由机制而不是手动检查。

    【讨论】:

    • 这个建议的解决方案效果很好。不幸的是,这个解决方案的唯一缺点是它不能很好地适应大量默认参数。当您构建必须支持列表过滤的 Web 服务/Web 应用程序时,在路由中公开所有默认参数会降低代码的可读性和健壮性。在所有其他情况下,这确实是首选解决方案
    • 答案已更新为您可能会发现有用的辅助方法实现。
    • 我提出了对 play 框架的扩展,以编写关于默认参数的更多代码驱动的方法。见github.com/playframework/Play20/pull/381
    【解决方案2】:

    在 Play 2.1 中

    val p = 形式( 映射( “顶部”-> 默认(数字,42) )(CData.apply)(CData.unapply) ).bindFromRequest()

    会做你想做的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-23
      • 2013-07-04
      • 1970-01-01
      • 2015-03-28
      • 1970-01-01
      相关资源
      最近更新 更多