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
相关产品推荐
相关产品推荐

