Rails7中form设置data-turbo-stream=false无效,POST仍走turbo_stream
解决表单设置data-turbo-stream=false仍触发turbo_stream响应的问题
你遇到的问题是Rails 7中,即使在form_with里设置了data-turbo-stream="false",控制器的create方法依然优先响应turbo_stream格式。这是因为Turbo默认会为请求添加text/vnd.turbo-stream.html的Accept头,且该格式的优先级高于text/html,导致respond_to分支优先匹配turbo_stream。
以下是几种可行的解决方案:
方案1:在form_with中指定format为html
直接在form_with参数里添加format: :html,强制表单请求HTML格式,这样控制器会优先匹配format.html分支:
<%= form_with(model: book, format: :html) do |form| %>
生成的HTML表单action会变为/books.html,Rails会识别该请求为HTML格式,触发对应的redirect或render逻辑。
方案2:禁用表单的Turbo功能
如果不需要该表单使用Turbo的任何特性,可以直接设置data-turbo="false",让表单以传统方式提交,请求头会默认使用text/html:
<%= form_with(model: book, data: {turbo: false}) do |form| %>
这种方式会完全绕过Turbo的处理,回到Rails传统表单提交流程。
补充说明
你当前控制器的respond_to分支顺序是合理的,但Turbo发送的请求头中text/vnd.turbo-stream.html的权重更高,所以即使存在format.html分支,依然会优先匹配turbo_stream。通过上述两种方法修改请求格式,就能让控制器正确响应HTML格式。
内容的提问来源于stack exchange,提问作者Johan Donado B.
相关产品推荐
相关产品推荐

