Vapor 大型教程
删除缩略语页面
本章用最简单的方式实现「删除缩略语」:受浏览器表单限制,用 POST 请求触发删除并跳回首页。
为什么也用 POST
由于浏览器的关系,表单只能发送 POST、GET 请求,而不能直接发送 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")