【发布时间】:2014-12-31 03:19:36
【问题描述】:
我正在尝试使用 play 2.0 构建一个 REST API。我有一个用户案例类,其中包含一些不应通过 updateMember 方法更新的字段(如用户名和密码)。
有没有一种很好的功能性方式来处理多个选项,因为request.body.asJson 返回一个选项[JsValue],而我的用户查找也返回一个选项:
package controllers.api
import org.joda.time.LocalDate
import play.api.Play.current
import play.api.db.slick.{DB, Session}
import play.api.mvc._
import play.api.libs.json._
import play.api.libs.functional.syntax._
import models.{Gender, User, UserId}
import repositories.UserRepository
object Member extends Controller {
def updateMember(id: Long) = Action {
DB.withSession {
implicit session: Session =>
val json: JsValue = request.body.asJson // how to deal with this?
val repository = new UserRepository
repository.findById(new UserId(id)).map {
user =>
def usernameAppender = __.json.update(
__.read[JsObject].map { o => o ++ Json.obj("username" -> user.username) }
)
json.transform(usernameAppender) // transform not found
Ok("updated")
}.getOrElse(NotFound)
}
}
}
我可以将map 调用移动到我尝试解析请求的位置,但是在里面我想我需要另一个映射到用户选项上,就像我已经拥有的那样。所以在那种风格中,我需要每个选项一个map。
在 FP 中有没有更好的方法来处理像这样的多个选项?
【问题讨论】: