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

ActionController::UnknownFormat错误:Rails产品分类筛选问题排查

排查ActionController::UnknownFormat错误(产品分类筛选功能)

问题场景

实现产品按分类筛选功能时,运行代码触发ActionController::UnknownFormat错误。

现有代码

ProductController 代码

class ProductController < ApplicationController
    
    def index
        @product = Product.all 
        @categories = Category.all
    end
    
    def from_category
        @product = Product.joins(:category).where(category: { id: params[:cat_id] })
        respond_to do |format|
            format.js
        end
    end
end

视图文件(注:原文件名form_category.js.erb疑似笔误,应为from_category.js.erb)

$("#products_grid").html("<%= escape_javascript(render partial: 'product/products_list', locals: { product: @selected } ) %>");

错误原因

  1. 请求格式不匹配:控制器from_category方法仅响应js格式,但前端发起的请求未指定该格式(比如普通HTML请求),导致Rails找不到对应响应格式,抛出错误。
  2. 变量名不一致:控制器定义的变量是@product,但视图渲染partial时使用@selected,会导致数据无法正确传递。
  3. 模板文件名不匹配:控制器方法名为from_category,但视图文件名写为form_category.js.erb,Rails无法找到对应模板,也会引发格式类错误。

修复方案

1. 确保请求指定JS格式

前端发起请求时明确指定JS格式:

  • 用Rails链接:<%= link_to "分类名称", from_category_path(cat_id: category.id), remote: true %>(remote: true自动发起AJAX并指定JS格式)
  • 手动AJAX请求:
$.ajax({
  url: '/products/from_category',
  data: { cat_id: 分类ID },
  dataType: 'script'
});

2. 修正变量名与模板文件名

  • 统一控制器与视图的变量名:
def from_category
    @selected = Product.joins(:category).where(category: { id: params[:cat_id] })
    respond_to do |format|
        format.js
    end
end
  • 将视图文件名改为from_category.js.erb,与控制器方法名对应。

3. (可选)兼容其他请求格式

添加默认格式处理,避免非法请求报错:

def from_category
    @selected = Product.joins(:category).where(category: { id: params[:cat_id] })
    respond_to do |format|
        format.js
        format.html { redirect_to products_path, notice: '无效的请求格式' }
    end
end

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 10:55:21