如何在用作表单的case类中实现验证(使用Json.fromJson)
我使用TypeSafe激活器模板作为应用程序的基础(play+reactivemongo+knockoutJS) 我正在尝试创建一个用户,在创建的过程中,我想验证他们提供的国家是否已经在数据库中。但是由于程序的结构,我发现很难进行验证 代码 我的问题是折叠:我需要验证数据库中是否存在国家,并且需要获取创建用户的国家(这是一个异步操作) 我最好的想法是让UserForm实现一些提供“fold”方法的东西(如Json…fold),这样,如果找不到国家,我就可以返回invalid。如果我知道它存在,构建MongoDB查询、等待它并执行.get选项可能会更容易,因为我已经知道它存在 希望我说清楚 有什么想法吗 [编辑] 接受以下建议,但有一些改动: 你给了我方向,但我修改了一点: 我更改了UserForm类,将Country作为参数,而不是[string]国家名称。我想我会将列表传递给模板,模板将呈现给列表,所选国家将被JSONE并按原样上传(国家有一个json.format) 我在CountryDao中创建了exists(c:Country)方法,它只对数据库进行查找并返回结果 然后,我将saveUser更改为:如何在用作表单的case类中实现验证(使用Json.fromJson),json,mongodb,scala,playframework-2.0,reactivemongo,Json,Mongodb,Scala,Playframework 2.0,Reactivemongo,我使用TypeSafe激活器模板作为应用程序的基础(play+reactivemongo+knockoutJS) 我正在尝试创建一个用户,在创建的过程中,我想验证他们提供的国家是否已经在数据库中。但是由于程序的结构,我发现很难进行验证 代码 我的问题是折叠:我需要验证数据库中是否存在国家,并且需要获取创建用户的国家(这是一个异步操作) 我最好的想法是让UserForm实现一些提供“fold”方法的东西(如Json…fold),这样,如果找不到国家,我就可以返回invalid。如果我知道它存在,构
...
form => Async {
CountryDao.exists(form.country) match {
case c if c==true => {
UserDao.save(form.toUser map {_ =>
Created.flashing(Flash(Map("result" -> "success")))
}
}
case c if c==false => {
Future(BadRequest("Invalid Country").flashing(
Flash(Map("errors" -> "Invalid Country"))))
}
}
}
它编译。让我们看看它是否也有效:)
不管怎么说,我想现在已经解决了。谢谢你,mantithetical一个选项是执行以下操作:
def save = Action(parse.json) { req =>
Json.fromJson[UserForm](req.body).fold(
invalid => {
BadRequest("Bad form").flashing(Flash(Map("errors" -> JsError(invalid).toString)))
},
form => Async {
CountryDao.find(form.country).map { c => // assuming find returns an Option
UserDao.save(form.toUser(c) /* or form.toUser() */).map(
_ => Created.flashing(Flash(Map("result" -> "success"))))
}.getOrElse(
BadRequest("Invalid Country").flashing(
Flash(Map("errors" -> "Invalid Country")))) // or something else more appropriate
}
)
}
您可以修改toUser
函数,以获取类型为country
的参数country,前提是您不想查找两次country
def toUser (country: Country): User = User(
BSONObjectID.generate,
Name(firstName, midName, lastName),
Vector(Email(email)),
Vector(Phone(phone)),
Address(addr1, addr2, addr3, city, state, zip, country)
)
def toUser (country: Country): User = User(
BSONObjectID.generate,
Name(firstName, midName, lastName),
Vector(Email(email)),
Vector(Phone(phone)),
Address(addr1, addr2, addr3, city, state, zip, country)
)