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

Rails使用form_with提交POST请求报No route matches [POST]错误

问题原因

报错核心是两个写法问题:

  1. 视图里form_with的url参数传了字符串"report_client_path",没有调用路由辅助方法。Rails会把传入的字符串直接作为提交路径,最终表单会提交到/report_client_path这个不存在的地址,和你配置的/report_client路由完全不匹配。
  2. 你当前的路由写法只给GET类型的/report_client生成了report_client_path命名辅助方法,POST类型的同路径路由没有绑定命名别名,就算去掉引号直接写方法名,也没法正确识别POST路由。
修复方法
  1. 先修改路由配置,推荐用Rails内置的单数资源路由写法,自动生成对应GET/POST的路由和辅助方法,不需要手动写两条规则:
# config/routes.rb
Rails.application.routes.draw do
  # 替换原来单独写的get、post两条report_client路由
  resource :report_client, only: [:index, :create]

  root "home#index"
end

改完执行rails routes就能看到,GET和POST的/report_client路径都会自动绑定到对应控制器动作,且共用report_client_path辅助方法,会根据请求方法自动匹配对应动作。

  1. 再修改视图里的表单代码,去掉url参数值的引号,直接调用路由辅助方法即可。form_with默认会对提交类请求自动使用POST方法,不需要手动指定method: :post:
<%# app/views/report_client/index.html.erb %>
<%= form_with url: report_client_path do |f| %>
  <%= f.label :salary, "Salary: " %><br><br>
  <%= f.text_field :salary %>
  <button type="submit">Enviar</button>
<% end %>
  1. 改完之后重启Rails开发服务器,刷新页面查看表单源码,就能看到form标签的action属性已经是正确的/report_client,提交就不会再触发路由不匹配错误。

补充:如果你不想用resource写法,也可以给原来的POST路由手动加as: :report_client参数,让两条路由共用同一个命名辅助方法,效果和上面的resource写法一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 07:45:34