我需要在我的网络应用程序中允许用户更新现有项目。但是,我想知道如何存储原始值,以便可以删除它,并在用户填写表单后使用新值。
让我展开一点:
基本上,我最初为用户提供填写表单。填写表单后,我从表单的属性创建一个对象 - 年龄,名称,高度等内容存储在一个对象中,让我们称之为Person:
case class Person(age: Int, name: String, height: Int)
现在,当用户点击该项旁边的修改按钮时,可以编辑此信息。因此,在网站上,可以选择编辑此人。
我的问题是, 如何存储上一个人,一旦用户在网站上按Update
,我就可以删除原始人物对象并将其替换为新的一个?
我目前的解决方案是将原始对象存储在会话(作为JSON)中,然后在更新表单时,我从会话中读取JSON以执行更多工作。
我觉得这不安全因为(如果我错了,请纠正我)可以从应用程序外部更改会话数据json,从而允许某人更改此人的姓名或我不会知道这个,然后从列表中删除错误的人而不是我要更新的人。
def editPerson(name: String) = Action { implicit request =>
Person.findByName(name).map { person =>
val form = personForm.fill(person)
Ok(views.html.persons.editPerson(form))
.addingToSession(("Edit", Json.prettyPrint(Json.toJson(person))))
} getOrElse NotFound
}
上述方法映射到允许指定要编辑的人的路线。按下Update
按钮时,将调用以下控制器方法:
def save = Action { implicit request =>
val newPersonForm = personForm.bindFromRequest()
newPersonForm.fold(
hasErrors = { form =>
request.session.get("Edit").map { person =>
Redirect(routes.Persons.editPerson(person.name))
.flashing(Flash(form.data) + ("error" -> Messages("validation.errors")))
} getOrElse(BadRequest.removingFromSession("Edit"))
},
success = { newPerson =>
request.session.get("Edit").foreach { prevP =>
Person.remove(prevP) // delete the person that was edited
}
Person.add(newPerson) // add the new person
val message = Messages("persons.new.success", newPerson.name)
Redirect(routes.Persons.show(newPerson.name)).flashing("success" -> message).removingFromSession("Edit")
}
)
}
上述save
方法的作用是,如果表单已完成但有错误,则会再次从会话中读取人员信息,我们将再次重定向到编辑页面。
如果表单没有错误,我们再次从会话中读取人员信息,这次删除它并添加新人。
我可以使用哪些其他方法来确保对象不会暴露在外部并保留在控制器中,直到用户在表单中输入有效值,然后删除要编辑的对象并且新增了一个?