Rails中Turbo.visit发起POST请求触发GET请求的问题排查咨询
问题原因
Turbo.visit API 设计上仅支持发起GET类型页面导航,在配置项的data字段传入turbo-method: post的写法不会被Turbo解析,执行后会默认回退为GET请求,无法达到预期效果。
正确实现方式
Turbo 中POST/PUT/DELETE等非GET请求的导航需要通过官方表单提交API实现,触发逻辑和页面上点击配置了data-turbo-method="post"的链接完全一致,参考代码如下:
// 组装请求提交参数 const submitData = new FormData() // 开启CSRF校验的场景需要携带合法令牌,以Rails生态为例可直接从页面meta标签读取 const csrfToken = document.querySelector('meta[name="csrf-token"]')?.getAttribute('content') if (csrfToken) submitData.append('authenticity_token', csrfToken) // 此处可追加业务需要的其他POST参数 // submitData.append('key', 'value') // 构造临时表单DOM const tempForm = Object.assign(document.createElement('form'), { action: 'documents/path', method: 'post', enctype: 'application/x-www-form-urlencoded' }) // 发起POST请求,Turbo会自动处理后续的页面替换、滚动重置等导航逻辑 Turbo.navigator.submitForm(tempForm, { formData: submitData })
注意事项
- 不要尝试给
Turbo.visit传入method相关配置,该方法从设计层面就没有提供支持非GET请求的配置项 - 若项目开启了CSRF校验,必须在提交参数中携带合法的CSRF令牌,否则请求会被服务端拦截返回403/422错误
- 上述写法兼容Turbo 7.0及以上所有稳定版本
- 如果需要提交JSON格式载荷、或者携带自定义请求头,需要先通过
Turbo.fetch发起接口请求拿到响应内容,再手动调用Turbo.render完成页面渲染,无法直接通过导航API实现
内容的提问来源于stack exchange,提问作者Petros Kalafatidis
相关产品推荐
相关产品推荐

