Ruby控制器实现页面重载:购物车商品数量减少功能咨询
实现购物车商品数量减少后的页面重载
嘿,看你的代码应该是在Rails项目里做购物车功能对吧?当前你用了remote: true发起AJAX请求,控制器返回JSON数据,所以默认不会触发页面刷新。要实现页面重载,有几个简单可行的方案,我给你拆解清楚:
方案1:在AJAX成功回调里手动刷新页面
因为你用了Rails UJS(remote: true依赖这个功能),可以直接在视图里添加JavaScript监听请求成功的事件,然后触发页面刷新:
修改你的_line.html.haml文件
.quantity_changer = link_to decrease_order_path(line_item.id), method: :post, remote: true, class: 'cart-item-change minus', data: { turbo: false } do %i.fa.fa-minus :javascript // 监听AJAX成功事件 document.addEventListener('ajax:success', function() { // 刷新当前页面 window.location.reload(); });
小提醒:如果你的项目是Rails 7及以上,默认启用了Turbo,记得加上
data: { turbo: false }来禁用Turbo的默认处理,确保UJS的AJAX逻辑能正常触发回调。
方案2:让控制器直接返回刷新页面的JS代码
这种方式更直接,不用改视图,只需要调整控制器的decrease方法,把返回JSON改成返回一段执行刷新的JavaScript:
修改order_controller_decorator.rb
def decrease quantity = change_quantity(-1) # 直接渲染JS代码,浏览器执行后就会刷新页面 render js: "window.location.reload();" end
这样当请求完成后,浏览器会自动执行这段JS,完成页面重载。
额外补充:局部刷新(更友好的用户体验)
其实如果只是更新购物车的数量和总价,完全没必要全页刷新,局部更新体验会更好。如果你感兴趣的话,可以试试这个方案:
保持控制器返回JSON不变,然后在前端用JS更新对应的DOM元素:
.quantity_changer = link_to decrease_order_path(line_item.id), method: :post, remote: true, class: 'cart-item-change minus', data: { turbo: false } do %i.fa.fa-minus # 假设你有显示当前商品数量的元素 .item-quantity= line_item.quantity # 假设页面上有显示购物车总价的元素 .cart-total= current_order.display_item_total :javascript document.addEventListener('ajax:success', function(event) { const [responseData] = event.detail; // 更新商品数量 document.querySelector('.item-quantity').textContent = responseData.quantity; // 更新购物车总价 document.querySelector('.cart-total').textContent = responseData.total; });
这种方式不用刷新整个页面,用户体验更流畅,但如果你确实需要全页重载,前面两个方案就完全够用啦。
内容的提问来源于stack exchange,提问作者Cliff_Cleet
相关产品推荐
相关产品推荐

