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

Rails 6.1升级至7.0后,如何将默认请求处理改为Turbo Stream?

Rails 7升级后默认请求以HTML而非Turbo Stream处理的解决办法

核心说明

Rails 7默认启用Turbo,但表单/button_to生成的请求默认仍以HTML格式发起,日志显示Processing as HTML是正常的——要让请求优先以Turbo Stream处理,需要调整请求头或全局配置,同时确保控制器能返回对应的Turbo Stream响应。

解决方案

1. 单个按钮/表单指定Turbo Stream格式

修改button_to的data属性,添加turbo_stream: true,让该请求的Accept头优先包含Turbo Stream格式:

<%= button_to change_shops_for_analysis_promotions_path, method: :post, params: {shop_id: shop.id, toggle: 0}, data: { turbo_stream: true } do %>
  <!-- 按钮内容 -->
<% end %>

2. 全局配置所有Turbo表单默认用Turbo Stream

在config/initializers/turbo.rb中添加以下配置(文件不存在则新建):

Rails.application.config.turbo.formats = [:turbo_stream, :html]

之后所有由Turbo处理的表单、按钮请求都会优先发送Turbo Stream格式的Accept头,控制器会优先匹配Turbo Stream响应模板。

3. 控制器强制返回Turbo Stream响应

针对特定控制器动作,明确指定响应格式,确保返回Turbo Stream:

# app/controllers/promotions_controller.rb
def change_shops_for_analysis
  # 执行你的业务逻辑(比如更新shop关联状态)
  @shop = Shop.find(params[:shop_id])
  # ...

  respond_to do |format|
    format.turbo_stream # 优先返回turbo_stream模板
    format.html { redirect_to promotions_path } # 降级处理
  end
end

同时需要创建对应的Turbo Stream模板文件app/views/promotions/change_shops_for_analysis.turbo_stream.erb,示例内容:

<%= turbo_stream.replace "shop-#{@shop.id}" do %>
  <!-- 这里写更新后的DOM内容,比如切换按钮状态 -->
  <%= button_to change_shops_for_analysis_promotions_path, method: :post, params: {shop_id: @shop.id, toggle: 1}, data: { turbo_stream: true } do %>
    取消选择
  <% end %>
<% end %>

验证要点

  • 确认app/javascript/application.js中已导入Turbo:import "@hotwired/turbo-rails"
  • 确认turbo-rails gem已正确安装(Gemfile中已包含,且执行过bundle install)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 23:00:08