【发布时间】:2019-12-04 06:46:17
【问题描述】:
我有一个Group、User和一个App模型。在我的 Group 模型中,我有一个属性 var apps: [App],我创建了一个兄弟关系 bw Group 和 User。
在我的网站控制器中,我有 2 个处理程序:
-
createGroupHandler在 /groups/create 处理 GET 请求 -
createGroupPostHandler在 /groups/create 处理 POST 请求
我的问题是,在我的 createGroup.leaf 模板中的表单中选择应用程序对象后,当我创建新组时,没有应用程序填充到我的应用程序数组中。
我创建了结构来表示在我的createGroupHandler 中呈现的上下文,并处理在createGroupPostHandler 的发布请求中传递的数据
struct CreateGroupContext: Encodable {
let title = "Create Group"
let users: Future<[User]>
let apps: Future<[App]>
}
struct CreateGroupData: Content {
let name: String
let apps: [App]
let users: [String]?
}
应用程序已正确加载到表单中,但尽管如下图所示选择了它们,但它们并未添加到数组
我的createGroupPostHandler 如下所示。 我不知道如何在创建群组时获取选定的应用程序并填充我的 apps: [App] 数组是我的问题,我觉得这是我应该这样做的地方,但我不知道不知道如何从 Leaf 模板中获取它。
func createGroupPostHandler(_ req: Request, data: CreateGroupData) throws -> Future<Response> {
let group = Group(name: data.name, apps: data.apps)
return group.save(on: req).flatMap(to: Response.self) { group in
guard let id = group.id else {
throw Abort(.internalServerError)
}
var userSaves: [Future<Void>] = []
for user in data.users ?? [] {
try userSaves.append(User.addUser(user, to: group, on: req))
}
let redirect = req.redirect(to: "/groups/\(id)")
return userSaves.flatten(on: req).transform(to: redirect)
}
}
【问题讨论】:
-
对于遇到类似问题的任何人,我决定在应用程序和组之间建立一个多对多关系,并在我的内部创建一个
addApp函数App 模型基于在 html<input>表单中键入的字符串和传入的组对象(在 Vapor 书中完成)附加新关系。我不想出一种方法来填充在我的 Group 模型中声明的var apps: [App]属性。
标签: swift forms vapor server-side-swift leaf