我正在尝试创建一种更新的方法来更新数据库中的数据,我在Play上使用Scala!框架。我有一个名为Application的模型,我希望能够更新数据库中的应用程序。因此,put请求只需要您要更新的应用程序的ID,然后是您要更新的可选属性。
所以在我的路线中我有这个:
PUT /v1/auth/application controllers.Auth.update_application(id: Long)
我目前拥有的方法是:
def update_application(id: Long) = Action { implicit request =>
var app = Application.find(id)
for((key, value) <- request.queryString) {
app."$key" = value(0)
//app.name = value(0)
}
val update = Application.update(id, app)
Ok(generate(
Map(
"status" -> "success",
"data" -> update
)
)).as("application/json")
}
在上面的方法中,我循环遍历请求和app对象作为地图实例,然后使用模型更新要更新的app模型。我知道有一种更简单的方法是将请求字符串创建为map并且只是迭代遍历该对象,但我这样做是为了学习目的。我是新Play!
和Scala
的新手,仅仅一周新。
有没有办法以这种方式动态设置属性?在循环结束时的上述方法中,我将如何在Groovy
中更新对象的属性。所以我在Scala中寻找相同的东西。如果Scala不能做到这一点,那么完成这项任务的最佳方法是什么? Reflection
?我不想让事情过于复杂
答案 0 :(得分:1)
播放!提供play.api.data.Forms
,允许创建使用案例类的apply()
和unapply()
方法的表单。然后,您可以调用form.fill(app)
创建具有初始状态的表单bindFromRequest(request)
以使用请求参数更新表单,并get()
以获取具有更新字段的新实例。
仅定义表单一次:
val appForm = Form(
mapping(
"field1" -> text,
"field2" -> number
)(Application.apply)(Application.unapply)
)
然后在你的控制器中:
val app = appForm.fill(Application.find(id)).bindFromRequest(request).get
val update = Application.update(id, app)
从文档中查看Constructing complex objects。