You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何未显式设置时Rails Action仍以TURBO_STREAM方式处理?

Rails 7表单提交后重定向至show动作被识别为TURBO_STREAM的解决方案

问题原因

Turbo是Rails 7默认集成的前端框架,它会自动为表单添加Turbo行为:

  • 表单提交时发送的请求Accept头为text/vnd.turbo-stream.html
  • 当create动作执行重定向时,Turbo会跟随重定向并保留原请求的Accept头,导致show动作被处理为TURBO_STREAM请求
  • 手动访问时浏览器发送的是HTML请求,因此show动作能正常响应HTML内容

解决方案

方案1:让表单以HTML格式提交

在simple_form_for中添加data-turbo="false",禁用Turbo对该表单的处理:

<%= simple_form_for book, data: { turbo: false } do |f| %>
  ...(表单元素)...
  <%= f.button :submit %>
  <%= link_to 'Cancel', books_path, class: 'form-cancel-button' %>
<% end %>

或者直接指定请求格式为HTML:

<%= simple_form_for book, format: :html do |f| %>
  ...(表单元素)...
<% end %>

方案2:修改show动作支持Turbo Stream响应

如果希望保留Turbo的无刷新特性,可以为show动作添加Turbo Stream模板,实现页面内容的局部更新:

  1. 在app/views/books目录下创建show.turbo_stream.erb文件
  2. 写入以下内容(需替换book-container为你页面中实际的容器ID):
<%= turbo_stream.replace "book-container", BookDetailComponent.new(book: @book) %>

方案3:重定向时强制指定HTML格式

在create动作的redirect_to中添加format: :html,让重定向后的请求以HTML格式发送:

if @book.save
  redirect_to book_path(@book, format: :html), notice: "Book saved"
else
  render :new, status: :unprocessable_entity
end

内容的提问来源于stack exchange,提问作者tkhobbes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 22:24:11