删除缩略语页面 封面
Vapor 大型教程

删除缩略语页面

本章用最简单的方式实现「删除缩略语」:受浏览器表单限制,用 POST 请求触发删除并跳回首页。

为什么也用 POST

由于浏览器的关系,表单只能发送 POSTGET 请求,而不能直接发送 DELETE 请求(虽然用 JS 可以做到,但本章不展开)。所以我们用一个 POST 路由来实现删除功能。

控制器中的删除路由

WebsiteController.swift 注册一条 POST 路由,路径为 acronyms/:id/delete

router.post("acronyms", Acronym.parameter, "delete", use: deleteAcronymHandler)

处理方法里,先通过 req.parameters.next(Acronym.self) 取出目标对象,调用 .delete(on: req) 删除,再用 transform(to:) 把结果转换成「重定向到首页」的响应。

func deleteAcronymHandler(_ req: Request) throws -> Future<Response> {
    return try req.parameters.next(Acronym.self).delete(on: req)
    .transform(to: req.redirect(to: "/"))
}
原理:delete(on:) 返回一个 Future<Void>transform(to:) 忽略掉这个空结果,直接返回我们准备好的重定向响应,因此删除完成后用户会被带回到首页。

详情页加上删除按钮

acronym.leaf 中,把编辑链接和删除按钮放进同一个表单(action 指向删除路由)。点击 Delete 即提交 POST 触发删除。

#set("content"){
    <h1>#(acronym.short)</h1>
    <h2>#(acronym.long)</h2>
    <p>Created by <a href="/users/#(user.id)/">#(user.name)</a></p>
    <form method="post" action="/acronyms/#(acronym.id)/delete">
        <a class="btn btn-primary" href="/acronyms/#(acronym.id)/edit" role="button">Edit</a> 
        <input class="btn btn-danger" type="submit" value="Delete" />
    </form>
}

#embed("base")

本系列其他文章