使用scala中的变量值设置对象的属性

时间:2013-03-15 17:34:55

标签: scala playframework-2.0

我正在尝试创建一种更新的方法来更新数据库中的数据,我在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?我不想让事情过于复杂

1 个答案:

答案 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