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

Rails 5中ActionController::UnknownFormat错误解决求助

解决ActionController::UnknownFormat错误(Ajax + format.js场景)

以下是针对问题的排查和解决方法:

1. 确认路由配置正确

在config/routes.rb中确保对应路由为POST请求(button_to默认生成POST表单),且未限制响应格式:

post '/product_items/:id/add', to: 'product_items#add_quantity', as: 'product_add'
post '/product_items/:id/reduce', to: 'product_items#reduce_quantity', as: 'product_reduce'

2. 给button_to强制指定JS格式

在视图的button_to中添加format: :js参数,确保请求以JS格式发送:

.input-number__add
  = button_to '', product_add_path(id: product_item, format: :js), remote: true, class: ''
.input-number__sub
  = button_to '', product_reduce_path(id: product_item, format: :js), remote: true, class: ''

3. 完善控制器的响应处理

  • 先在控制器类中声明支持JS格式:
class ProductItemsController < ApplicationController
  respond_to :html, :json, :js
  # ...其他代码
end
  • 同时在add_quantity方法中处理保存失败的场景,避免无响应格式导致的错误:
def add_quantity
  @product_item = ProductItem.find(params[:id])
  @product_item.quantity += 1

  if @product_item.save
    respond_to do |format|
      format.js { render partial: 'product_items/add_quantity' }
    end
  else
    respond_to do |format|
      format.js { render js: "alert('数量更新失败');" }
    end
  end
end

4. 检查JS模板文件路径与内容

确保app/views/product_items/add_quantity.js.erb文件存在,且包含合法的DOM更新代码,示例:

// 更新对应商品的数量显示
$('.input-number__value[data-id="<%= @product_item.id %>"]').text('<%= @product_item.quantity %>');

5. 确认Rails UJS已正确加载

检查核心依赖是否加载,这是remote: true生效的关键:

  • Rails 5及之前:在app/assets/javascripts/application.js中添加//= require rails-ujs
  • Rails 6+:在app/javascript/packs/application.js中添加import Rails from "@rails/ujs"; Rails.start();

内容的提问来源于stack exchange,提问作者Samuel D.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 07:20:45