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

Rails 7调用destroy动作资源未删除及路由异常问题求助

问题解决建议

一、单元测试失败:Cart.count未减少1

你的destroy动作存在逻辑错误,导致购物车被删除后又被恢复:

  • @cart.destroy!已经从数据库中删除了购物车记录,但后续调用的@cart.save会将已标记为销毁的对象重新保存回数据库(Rails中,已销毁对象调用save会取消销毁状态并重建记录)。
  • 直接删除@cart.save这行代码即可解决计数不减少的问题。

修正后的destroy动作:

def destroy    
  @cart.destroy! if @cart.id == session[:cart_id]
  session[:cart_id] = nil

  respond_to do |format|
    format.html { redirect_to store_index_url,
      notice: 'Your cart is currently empty' }
    format.json { head :no_content }
  end
end

额外验证:确保控制器中有before_action正确加载当前会话的购物车,比如:

before_action :set_current_cart

private
def set_current_cart
  @cart = Cart.find(session[:cart_id]) if session[:cart_id]
end

二、路由错误:No route matches [DELETE] "/carts"

路由DELETE /carts/:id(.:format) carts#destroy要求必须传递购物车ID,但你的button_to生成了不带ID的路径,原因是模板中的cart变量可能为nil或未正确赋值:

  • 检查模板所在页面的控制器动作,是否将当前购物车实例赋值给了@cart(比如在对应动作中设置@cart = Cart.find(session[:cart_id]))。
  • 将模板中的cart改为@cart,确保传递正确的购物车实例:

修正后的ERB代码:

<%= button_to 'Empty Cart', @cart, method: :delete,
  class: "ml-4 rounded-lg py-1 px-2 text-white bg-green-600" %>

如果cart是你定义的局部变量,确认它不为nil且包含有效的id属性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 09:27:23