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

Rails 6 form_with提交持久化记录编辑表单仍发送POST请求报错

问题原因分析
  • 你的嵌套路由配置下,更新已持久化的line_item对应PATCH方法的路由/admin/orders/:order_id/line_items/:id,而报错显示表单用POST方法提交带id的路径,Rails的资源路由中POST方法仅对应创建新资源的/admin/orders/:order_id/line_items路径(无id参数),因此匹配失败。
  • 核心触发原因:当你同时给form_with传入model和手动url参数时,部分Rails版本不会自动根据model的persisted?状态推断请求方法,默认 fallback 为POST,导致方法不匹配。
解决方案

方案1:手动指定请求方法

在表单中明确添加method: :patch参数,强制用PATCH方法提交:

= form_with model: @line_item, url: [:admin, @order, @line_item], method: :patch, local: true do |line_item|

方案2(更推荐):让Rails自动推断路由和方法

直接将命名空间、父资源、子资源按顺序传入model参数,无需手动写url,Rails会自动根据@line_item是否持久化选择正确的请求方法和路径:

= form_with model: [:admin, @order, @line_item], local: true do |line_item|

该写法同时兼容新建和编辑两种场景,无需额外判断资源状态。

验证方法

你可以在项目终端执行命令rails routes | grep line_item,确认路由列表中更新line_item的条目请求方法为PATCH、路径格式匹配你的业务需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 13:45:02