Vapor 大型教程
删除缩略语页面
浏览器表单没有 DELETE 方法,删除动作可以由 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")