【问题标题】:play framework how to reuse and extend a form mapping播放框架如何重用和扩展表单映射
【发布时间】:2014-08-25 10:34:34
【问题描述】:

我有一个表单映射,如下所示:

val myBaseMapping =  mapping(
  "email"                -> email,
  "password"             -> text.verifying("Please provide a password", !_.isEmpty)
)(BaseModel.apply)(BaseModel.unapply)

这代表FormA。我有另一种形式,FormB,它是相同的,但增加了几个字段。这是它的映射的样子:

val myExtendedMapping =  mapping(
  "email"                -> email,
  "password"             -> text.verifying("Please provide a password", !_.isEmpty)
  "name"                 -> text,
  "website"              -> text
)(ChildModel.apply)(ChildModel.unapply)

ChildModel 扩展 BaseModel:它添加了 2 个新字段,namewebsite

我正在尝试以不必复制共享字段(电子邮件和密码)的绑定定义的方式对myExtendedMapping 进行编码。

我不确定这里的 Scala 语法是什么。我不知道如何“扩展”给定的映射并向其添加绑定。另外,由于行为的不同,我不希望添加临时验证。这是可能的还是我只需要复制代码?

【问题讨论】:

  • 每个绑定到什么?
  • 我不确定这是否能回答您的问题,但要使用映射,我会这样做:Form(myMapping),然后使用它从 HTTP 请求中绑定。
  • 我的意思是,FormB 也应该绑定到MyModel,还是其他什么?如果是这样,那会是什么样子?
  • 哦,我明白了:我目前的计划是创建另一个单独的模型类,例如 MyChildModel 扩展 MyModel 以用于表单 B 的映射(添加那些额外的属性)。所以换句话说,我一直在寻找一种让表单绑定与模型对象结构平行的方法。但我绝对愿意接受更好的方式来组织这一切。

标签: scala playframework-2.0


【解决方案1】:

你可以做的是一个简单的组合。例如:

case class BaseModel(email: String, password: String)
case class ChildModel(name: String, website: String, base: BaseModel)

val commonMapping = mapping(
  "email" -> email,
  "passwod" -> texttext.verifying("Please provide a password", !_.isEmpty)
)(BaseModel.apply)(BaseModel.unapply)

val myExtendedForm = Form[ChildModel](mapping(
   "name" -> text,
   "website" -> text,
   "base" -> commonMapping
)
   ((name, website, base) => ChildModel(name, website, base))  //bind
   (child => Some(child.name, child.website, child.base))      //unbind
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-06
    • 1970-01-01
    • 1970-01-01
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多