2013-03-15 72 views
1

我試圖創建一個更新數據庫中的數據的方法,我在Play上使用Scala!框架。我有一個名爲Application的模型,我希望能夠更新數據庫中的應用程序。所以put請求只需要你想要更新的應用程序的id,然後是你想要更新的可選屬性。在scala中使用變量值設置對象的屬性

所以在我的路線我有這樣的:

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") 
    } 

在上面的方法,我通過請求和應用程序對象作爲一個循環地圖實例,然後使用該模型更新要更新的應用模型。我知道有一種更簡單的方法,就是將請求字符串創建爲map,然後迭代該對象,但我正在以此方式進行學習。我是Play!Scala的新手,幾乎沒有新的一週。

有沒有辦法用這種方式動態地設置一個屬性?在循環結束處的上述方法中,我將如何更新Groovy中的對象屬性。所以我正在尋找Scala中的等價物。如果斯卡拉不能這樣做,那麼完成這個任務的最好方法是什麼? Reflection?我不想過於複雜的東西

回答

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