Краткий способ обновления модели для соответствия тела запроса со Swift?
Учитывая метод контроллера, который принимает тело запроса, которое соответствует некоторым или всем свойствам объекта в Vapor, есть ли способ обновить объект, не назначая вручную все его свойства? В настоящее время я должен сделать это:
func update(_ req: Request) throws -> Future<Mission> {
let mission = try req.parameters.next(Mission.self)
let content = try req.content.decode(Mission.self)
return flatMap(to: Mission.self, mission, content) { (mission, content) in
mission.propertyA = content.propertyA
mission.propB = content.propB
mission.propC = content.propC
return mission.save(on: req)
}
}
Это не очень масштабируемо, так как требует, чтобы я вручную назначал каждое свойство. Я ищу что-то вроде этого:
func update(_ req: Request) throws -> Future<Mission> {
let mission = try req.parameters.next(Mission.self)
let content = try req.content.decode(Mission.self)
return mission.save(on: content)
}
Однако это приводит к ошибке Argument type 'EventLoopFuture<Mission>' does not conform to expected type 'DatabaseConnectable'
,
Какое здесь хорошее решение?
2 ответа
Эта ошибка, которую вы получаете, заключается в том, что вы пытаетесь сохранить (on: content), вам нужно сохранить запрос:
return mission.save(on: req)
При этом, что вы действительно хотите, это:
func update(_ req: Request) throws -> Future<Mission> {
let updatedMission = try req.content.decode(Mission.self)
return updatedMission.update(on: req)
}
Это декодирует объект Миссии, который находится в теле запроса, а затем обновляет Миссию с соответствующим идентификатором в базе данных. Поэтому убедитесь, что когда вы отправляете Mission JSON в теле, у него есть идентификатор.
С представлениями вы должны быть в состоянии сделать:
func create(req: Request) throws -> Future<Either<Mission, SubmissionValidationError>> {
return try req.content.decode(Mission.Submission.self)
.updateValid(on: req)
.save(on: req)
.promoteErrors()
}
Требуется некоторая настройка, но она гибкая и позволяет проверять введенные данные. promoteErrors
функция + Either
в результате помогите создать полезный ответ об ошибке, но вы можете обойтись без них.