首页 > 解决方案 > Vapor 3 - 如何从 Leaf 模板表单填充模型的数组属性

问题描述

我有一个GroupUser和一个App模型。在我的 Group 模型中,我有一个属性var apps: [App],并且我创建了一个兄弟关系 bw Group 和 User。

在我的 WebsiteController 中,我有 2 个处理程序:

  1. createGroupHandler在/groups/create处理GET请求
  2. 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)
        }
    }

这就是我的 createGroup.leaf 的样子:在此处输入图像描述

标签: swiftformsvaporserver-side-swiftleaf

解决方案


我在 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)
    }
}

推荐阅读