Rails路由问题:GET请求无法匹配PUT/PATCH路由,路径单复数异常
问题分析与解决
核心问题
你的路由配置里,scheduling_details资源仅启用了:create, :destroy, :update, :index动作,未包含:show动作,且update对应的路由只接受PATCH/PUT请求,不支持GET请求。而link_to默认发送GET请求,这直接导致路由不匹配错误。
另外你疑惑的复数路径是Rails的约定:单个资源的路由辅助方法(比如update对应的scheduling_scheduling_detail_path)生成的路径是复数形式/scheduling/scheduling_details/:id,这是正常设计,并非错误。
解决方案
根据你的实际需求分两种情况处理:
情况1:触发update动作(比如点击"Yes"更新资源)
需要给link_to指定请求方法为PATCH或PUT,因为update路由仅接受这两种请求:
<%= link_to "Yes", scheduling_scheduling_detail_path(@scheduling_detail), method: :patch %>
注意:该方式依赖Rails UJS,若用户浏览器禁用JavaScript会失效。更稳妥的方式是用
button_to,它会自动生成表单发送请求:<%= button_to "Yes", scheduling_scheduling_detail_path(@scheduling_detail), method: :patch %>
情况2:打开资源详情页(需要GET请求的详情页面)
需在路由配置中添加:show动作,让Rails生成对应的GET路由:
namespace :scheduling do resources :scheduling_details, only: [:create, :destroy, :update, :index, :show] end
添加后,rake routes会生成对应GET路由:
scheduling_scheduling_detail GET /scheduling/scheduling_details/:id(.:format) scheduling/scheduling_details#show
此时再使用原link_to代码即可正常访问。
关于手动路径的错误
你手动编写的单数路径/scheduling/scheduling_detail/:id不符合Rails路由约定,你的路由配置中根本不存在该路径的任何请求方法,因此无论是否带ID都会报错,建议始终使用Rails生成的路由辅助方法,避免手动拼接路径。
内容的提问来源于stack exchange,提问作者Jeff Zivkovic
相关产品推荐
相关产品推荐

