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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 04:33:19