Rails 7中link_to使用POST请求无效触发GET,如何解决?
问题原因与解决办法
核心原因
Rails 7.0 默认移除了 jQuery UJS,你用 link_to 指定 method: :post 时,生成的 data-method="post" 属性原本依赖UJS拦截点击事件,把默认的GET请求转为POST请求。缺少UJS的情况下,浏览器会直接发送GET请求,导致路由不匹配报错。
解决方案
方案1:改用 button_to(最推荐)
button_to 会直接生成包含POST表单的按钮,无需依赖JavaScript就能触发POST请求,适合这类提交操作:
<%= button_to 'Add to portfolio', user_stocks_path(user: current_user, ticker: @stock.ticker), class: "btn btn-xs btn-success logout-btn" %>
方案2:手动引入 Rails UJS
如果坚持用 link_to,可以重新引入UJS来处理 data-method 属性:
- 在
Gemfile中添加:gem 'rails-ujs' - 执行
bundle install - 根据你的前端环境完成引入:
- 若使用Sprockets(传统assets pipeline),在
app/assets/javascripts/application.js中添加://= require rails-ujs - 若使用Importmap,在
config/importmap.rb中添加:
然后在pin "rails-ujs", to: "rails-ujs.js"app/javascript/application.js中导入:import "rails-ujs"
- 若使用Sprockets(传统assets pipeline),在
额外检查
确保 config/routes.rb 中存在对应的POST路由,比如:
resources :user_stocks, only: [:create] # 或者 post '/user_stocks', to: 'user_stocks#create'
内容的提问来源于stack exchange,提问作者user3570727
相关产品推荐
相关产品推荐

