Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在用作表单的case类中实现验证(使用Json.fromJson)_Json_Mongodb_Scala_Playframework 2.0_Reactivemongo - Fatal编程技术网

如何在用作表单的case类中实现验证(使用Json.fromJson)

如何在用作表单的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。如果我知道它存在,构

我使用TypeSafe激活器模板作为应用程序的基础(play+reactivemongo+knockoutJS)

我正在尝试创建一个用户,在创建的过程中,我想验证他们提供的国家是否已经在数据库中。但是由于程序的结构,我发现很难进行验证

代码

我的问题是折叠:我需要验证数据库中是否存在国家,并且需要获取创建用户的国家(这是一个异步操作)

我最好的想法是让UserForm实现一些提供“fold”方法的东西(如Json…fold),这样,如果找不到国家,我就可以返回invalid。如果我知道它存在,构建MongoDB查询、等待它并执行.get选项可能会更容易,因为我已经知道它存在

希望我说清楚

有什么想法吗

[编辑] 接受以下建议,但有一些改动: 你给了我方向,但我修改了一点: 我更改了UserForm类,将Country作为参数,而不是[string]国家名称。我想我会将列表传递给模板,模板将呈现给列表,所选国家将被JSONE并按原样上传(国家有一个json.format)

我在CountryDao中创建了exists(c:Country)方法,它只对数据库进行查找并返回结果

然后,我将saveUser更改为:

...
      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)
)