0

我是 scala 和类型安全语言的新手,所以我可能会忽略一些基本的东西。这就是我的问题。

目标我想提交一个只有一个文本输入的表单,并且不反映我的案例类。它将以类型结束:字符串

问题无法从折叠中获得成功

我在前端有一个表单,我选择用 html 编写而不是 play 的表单助手(如果这是问题,愿意更改)

<form method="POST" action="@routes.Application.shorten()">
  <input id="urlLong" name="urlLong" type="text" placeholder="http://www.google.com/" class="span4"/>
  <div class="form-actions">
    <button type="reset" class="btn">Reset</button>
    <button type="submit" class="btn btn-primary pull-right"><span class="icon-random"></span> Shrtn It!</button>
  </div>
</form>

处理 post 操作的控制器如下所示:

import ...

object Application extends Controller {

  val newUrlForm = Form(
    "urlLong" -> text
  )

  def shorten = Action { implicit request =>
    val urlLong = newUrlForm.bindFromRequest.get

    newUrlForm.fold(
      hasErrors = { form =>
        val message = "Somethings gone terribly wrong"
        Redirect(routes.Application.dash()).flashing("error" -> message)
    },

    success = { form =>
      val message = "Woot it was successfully added!"
      Redirect(routes.Application.dash()).flashing("success" -> message)
    }
  }
  ...
}

我试图遵循/修改 Play for Scala 书中的教程,但它们的形式与案例类相匹配,而且 Play 的教程也与我的用例有所不同。连同您的答案,如果您可以包括您是如何计算出来的,那将非常有用,因此我可以更好地自行排除故障。

另外,如果重要的话,我会使用 intellij idea 作为我的 ide

4

2 回答 2

1

您需要在form.bindFromRequest上调用 fold 方法。从文档>处理绑定失败

loginForm.bindFromRequest.fold(
  formWithErrors => // binding failure, you retrieve the form containing errors,
  value => // binding success, you get the actual value 
)

您也可以将单个 Mapping 构造用于单个字段

Form(
  single(
    "email" -> email
  )
)
于 2013-02-18T17:10:16.383 回答
0

我最终得到了什么:

def shorten = Action { implicit request =>
  newUrlForm.bindFromRequest.fold(
    hasErrors = { form =>
      val message = "Somethings gone terribly wrong"
      Redirect(routes.Application.dash()).flashing("error" -> message)
    },

    success = { urlLong =>
      val message = "Woot it was successfully added!"
      Redirect(routes.Application.dash()).flashing("success" -> message)
    }
  )
}

不确定我是否真的理解我做错了什么,但是这个基于 mericano1 答案的代码最终也能正常工作。好像以前我从表单中取出 urlLong val,然后折叠表单,因为这会直接折叠表单,并在此过程中提取 urlLong 的 val。

另外我不确定为什么 fold 的参数记录不同。

于 2013-02-18T20:21:56.913 回答