Rails使用form_with提交POST请求报No route matches [POST]错误
问题原因
报错核心是两个写法问题:
- 视图里
form_with的url参数传了字符串"report_client_path",没有调用路由辅助方法。Rails会把传入的字符串直接作为提交路径,最终表单会提交到/report_client_path这个不存在的地址,和你配置的/report_client路由完全不匹配。 - 你当前的路由写法只给GET类型的
/report_client生成了report_client_path命名辅助方法,POST类型的同路径路由没有绑定命名别名,就算去掉引号直接写方法名,也没法正确识别POST路由。
修复方法
- 先修改路由配置,推荐用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辅助方法,会根据请求方法自动匹配对应动作。
- 再修改视图里的表单代码,去掉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 %>
- 改完之后重启Rails开发服务器,刷新页面查看表单源码,就能看到form标签的
action属性已经是正确的/report_client,提交就不会再触发路由不匹配错误。
补充:如果你不想用resource写法,也可以给原来的POST路由手动加
as: :report_client参数,让两条路由共用同一个命名辅助方法,效果和上面的resource写法一致。
内容的提问来源于stack exchange,提问作者Douglas Oliveira
相关产品推荐
相关产品推荐

