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 } ) %>");
错误原因
- 请求格式不匹配:控制器
from_category方法仅响应js格式,但前端发起的请求未指定该格式(比如普通HTML请求),导致Rails找不到对应响应格式,抛出错误。 - 变量名不一致:控制器定义的变量是
@product,但视图渲染partial时使用@selected,会导致数据无法正确传递。 - 模板文件名不匹配:控制器方法名为
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
相关产品推荐
相关产品推荐

