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-railsgem已正确安装(Gemfile中已包含,且执行过bundle install)
内容的提问来源于stack exchange,提问作者Jerome
相关产品推荐
相关产品推荐

