Rails 6.1搭配Hotwire时link_to指定method:get触发Form跳转报错问题
问题根因
- Rails的
link_to方法只要显式指定了method参数(无论值是get/post/put等),都会自动为生成的<a>标签添加data-method属性。该属性会被Rails默认加载的rails-ujs模块拦截,点击时不会触发原生的链接跳转,而是动态生成一个隐藏表单提交请求。 - 你仅给
<a>标签添加了data: {turbo: false}配置,只会让Turbo不拦截原生链接跳转,但rails-ujs动态生成的表单并没有携带data-turbo="false"属性,会被Turbo正常拦截处理。 - Turbo对表单提交的响应有默认规范:要求后端必须返回30x重定向响应,如果你当前接口直接返回200状态的页面内容,就会触发
Error: Form responses must redirect to another location报错。 - 移除
method: :get后,link_to不会生成data-method属性,rails-ujs不会拦截点击,也不会生成动态表单,就是普通的原生链接跳转,搭配你写的data: {turbo: false}配置,Turbo也不会拦截,自然就能正常运行。而且原生<a>标签默认就是GET请求,你额外加method: :get本身就是冗余操作。
可选解决方案
- 直接移除冗余的
method: :get配置,就是你现在已经验证可行的方案,也是最推荐的做法。 - 如果你一定要保留
method: :get配置,可以给全局表单加默认的Turbo禁用配置,或者升级匹配版本的hotwire-rails,让其自动处理data-method生成的表单的Turbo属性,不过完全没必要做多余的改造。
内容的提问来源于stack exchange,提问作者Nick_K
相关产品推荐
相关产品推荐

