Rails 7中respond_to报错ActionController::UnknownFormat求助
Rails 7 Turbo Stream 406 Not Acceptable 错误解决方案
问题根源
你的代码同时混用了旧版UJS的remote: true和Rails 7默认的Turbo特性,导致请求的Accept头不符合预期;加上多余的respond_to :js配置,让控制器无法匹配Turbo Stream格式的响应,最终触发406错误。
1. 修正表单代码
直接移除remote: true,Turbo默认会异步处理表单提交,remote: true属于旧版UJS语法,会干扰Turbo的请求格式:
<div class="search-area"> <h3>Search Stocks</h3> <%= form_tag search_stock_path, method: :get, data: {turbo_stream: true} do %> <div class="form-group row"> <div class="col-sm-9 noRightPad"> <%= text_field_tag :stock, params[:stock], placeholder: "Stock ticker symbol", autofocus: true, class: "form-control form-control-lg" %> </div> <div class="col-sm-3 noLeftPad"> <%= button_tag type: :submit, class: "btn btn-success" do %> <%= fa_icon "search 2x" %> <% end %> </div> </div> <% end %> </div>
2. 简化控制器代码
删掉respond_to :js,并确保控制器只响应Turbo Stream格式,同时处理无结果时的重定向(Turbo下重定向需要明确指定格式):
class StocksController < ApplicationController def search if params[:stock].present? @stock = Stock.new_lookup(params[:stock]) if @stock respond_to do |format| format.turbo_stream do render turbo_stream: turbo_stream.update( "results", partial: "users/result" ) end end else flash[:alert] = "Please enter a valid symbol to search" respond_to do |format| format.turbo_stream { redirect_to my_portfolio_path, flash: flash } format.html { redirect_to my_portfolio_path } end end else flash[:alert] = "Please enter a symbol to search" respond_to do |format| format.turbo_stream { redirect_to my_portfolio_path, flash: flash } format.html { redirect_to my_portfolio_path } end end end end
3. 确认页面存在目标元素
在你要渲染结果的页面(比如my_portfolio页面)中,必须有一个id="results"的容器,Turbo Stream才能定位并更新它:
<!-- 在portfolio视图中添加 --> <div id="results"></div>
4. 验证检查
- 打开浏览器开发者工具的Network标签,提交表单后查看请求的
Accept头,应该包含text/vnd.turbo-stream.html - 重启Rails服务器,清除浏览器缓存,确保Turbo的JS文件正确加载
- 确认
config/initializers/assets.rb中没有禁用Turbo(Rails 7默认启用)
内容的提问来源于stack exchange,提问作者Kirnc
相关产品推荐
相关产品推荐

