swift - Vapor 3 - 如何从 Leaf 模板表单填充模型的数组属性
问题描述
我有一个Group、User和一个App模型。在我的 Group 模型中,我有一个属性var apps: [App]
,并且我创建了一个兄弟关系 bw Group 和 User。
在我的 WebsiteController 中,我有 2 个处理程序:
createGroupHandler
在/groups/create处理GET请求createGroupPostHandler
在/groups/create处理POST请求
我的问题是,在我的createGroup.leaf模板中的表单中选择应用程序对象后,当我创建新组时,没有应用程序被填充到我的应用程序数组中。
我创建了结构来表示在我中呈现的上下文createGroupHandler
并处理在 post 请求中传递的数据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)
}
}
解决方案
我在 HTML 中使用命名input
标签的索引表示法,例如score[0]
,score[1]
等。Vapor 很乐意解析它并创建一个字典(好吧,技术上不是数组!)。
在 Leaf 文件中使用此表示法:
#for(result in results) {
<input type="text" name="score[#(index)]" value="#(result.score)">
}
控制器功能:
struct SaveResult:Content
{
var score:[Int:String]
}
func saveRoll(_ request:Request) throws -> Future<View>
{
return try request.content.decode(SaveResult.self).flatMap
{
result in
for i in 0...(result.score.count) - 1
{
print( detail.score[i] )
}
return try self.index(request)
}
}
推荐阅读
- python - listA.append(listB[:]) 和 listA.append(listB) 有什么区别?
- docker - 容器只读模式选项
- python - 如何从情节中删除情节徽标(“用情节制作”)
- pypi - 删除加入日期
- javascript - React SSR 导出默认组件
- ios - UIPickerView BarButton 文本颜色没有改变,但是当点击按钮时,颜色在 Objective-C 中改变
- react-native - React Native:在视频流顶部显示 OpenTok Publisher 的名称
- javascript - 如何将json数组对象转换为json数组
- gulp - 为什么我不能让 BrowserSync 与 Gulp 版本 4 一起使用?
- sql-server - 如果由于 order by 子句中的 case 语句导致 SELECT DISTINCT 错误,则 ORDER BY 项目必须出现在选择列表中