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
相关产品推荐
相关产品推荐

