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

Rails 7控制器无法渲染JS局部模板问题求助

解决Rails AJAX表单提交时的ActionController::UnknownFormat错误

问题场景

创建my_portfolio.html.erb表单,通过remote: true提交至StocksController#search方法,参数处理与验证正常,但渲染JS局部模板时触发ActionController::UnknownFormat错误。

核心问题分析

  1. 控制器中respond_to块的状态码使用错误,且JS模板渲染语法不符合Rails规范
  2. 代码结构存在潜在的语法闭合问题
  3. 请求格式与路由/控制器处理逻辑不匹配

解决方案

1. 修正控制器search方法代码

调整状态码(成功场景无需unprocessable_entity),修正JS模板渲染方式,确保代码结构正确:

class StocksController < ApplicationController
  def search
    if params[:stock].present?
      @stock = Stock.new_lookup(params[:stock])
      if @stock
        respond_to do |format|
          format.js { render 'users/result' }
        end
      else
        flash[:alert] = "请输入有效的股票代码"
        redirect_to my_portfolio_path
      end
    else
      flash[:alert] = "请输入股票代码进行搜索"
      redirect_to my_portfolio_path
    end
  end
end
  • 移除partial::Rails渲染JS模板时,会自动识别_result.js.erb为局部模板,无需显式声明
  • 去掉错误的status: :unprocessable_entity:该状态码用于验证失败场景,成功查询应使用默认200状态码

2. 确认JS模板路径

确保_result.js.erb存放路径为app/views/users/_result.js.erb,与控制器中render 'users/result'的路径对应。若模板位于app/views/stocks/目录下,需修改渲染路径为'stocks/result'。

3. 检查路由配置

确保路由支持JS格式请求,在config/routes.rb中添加或调整路由:

# 允许GET请求并支持JS格式
get 'search_stock', to: 'stocks#search', format: :js

或使用通用配置(允许多种格式):

get 'search_stock', to: 'stocks#search'

4. 确保AJAX请求正常触发

  • Rails 5-6版本:确认app/assets/javascripts/application.js中引入了Rails UJS:
    //= require rails-ujs
    
  • Rails 7+版本:若使用Turbo,确保turbo-rails已正确安装并引入;若需使用传统UJS,需手动添加rails-ujs依赖。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 03:33:22