You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rocket.rs中使用表单数据删除数据库条目遇阻求助

问题解决:Rocket.rs表单删除功能字段缺失错误

问题根源

  1. 表单字段名不匹配:你的NoteID结构体期望接收名为id的表单字段,但HTML中删除按钮的name属性是noteid,导致Rocket无法匹配对应字段,抛出Missing错误。
  2. HTML结构无效:表单标签嵌套错误,</form>放在了</li>之后,浏览器解析时会判定为无效结构,可能导致表单数据无法正确提交。

修复步骤

1. 修正HTML代码

调整表单结构,将</form>放在</li>之前,同时改用隐藏输入框传递ID(比按钮传递更稳妥,避免浏览器兼容性问题):

<h1>AAF Notebook</h1>
<form method='POST'>
<label>Note: <input name='note' value=''></label>
<button>Add</button>
</form>
<ul class='notes'>
<li class='notes'>
  note 1 
  <form method='POST' action='/delete'> 
    <input type="hidden" name="id" value="1">
    <button>Delete</button>
  </form>
</li>
</ul>

2. 确保NoteID结构体正确派生FromForm

确认你的NoteID结构体已正确派生Rocket的FromForm trait,且字段名与表单name一致:

use rocket::form::FromForm;

#[derive(FromForm)]
struct NoteID {
    id: u32, // 字段名必须和表单中的name对应
}

3. 优化删除函数(可选)

可以直接用数值类型绑定SQL参数,无需转字符串,同时后续建议改用Rocket数据库连接池替代手动打开连接:

#[post("/delete", data = "<noteid>")]
fn delete(noteid: Form<NoteID>) -> Redirect {
    println!("Deleting note with ID: {}", noteid.id);

    let conn = Connection::open("notes.db").unwrap();
    conn.execute("DELETE FROM notes WHERE rowid = ?", &[&noteid.id]).unwrap();
    Redirect::to("/")
}

验证

修改后点击删除按钮,表单会正确提交id字段,Rocket可正常解析NoteID结构体,删除操作即可执行。

内容的提问来源于stack exchange,提问作者Oscar S

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 02:30:48