【问题标题】:RoR 4 & TurboLinks 5 cache issueRoR 4 & TurboLinks 5 缓存问题
【发布时间】:2023-06-30 14:33:01
【问题描述】:

我有一个使用 turbolinks5 在 RoR 4 中制作的经典购物车应用程序。用户可以更改给定项目的数量并单击“更新购物车”按钮以更新购物车值。

“更新购物车”按钮提交 Ajax 表单 (data-remote="true") 以更新购物车并增加/减少放置在菜单中的购物车项目计数器。

现在的问题是:每次用户单击“更新购物车”按钮时,都会缓存购物车的新页面,因此如果用户更新购物车 3 次,然后单击浏览器的“返回按钮”,则会显示三个旧的购物车的版本(存储在缓存中)。

所以:

  1. 我在购物车页面中使用了<meta name="turbolinks-cache-control" content="no-cache">,这解决了问题,但似乎有点矫枉过正。

  2. 我在包含购物车项目计数 (<li class="active" id="cart_total_items" data-turbolinks-permanent>222<\li>) 的元素上使用了 data-turbolinks-permanent,但它不起作用,也就是说,当单击“后退按钮”时,会显示旧计数而不是新计数一。

  3. 如果我对所有页面使用<meta name="turbolinks-cache-control" content="no-cache">,它可以工作,但显然我想使用页面缓存

那么知道为什么这不起作用吗?

热烈的问候

【问题讨论】:

  • 尝试在这个事件中编写代码 $(document).on("turbolinks:load", function() { // 你的代码 });

标签: ruby-on-rails ajax cart turbolinks


【解决方案1】:

我相信您正在寻找的是Canceling visits before they start

应用程序访问可以在开始之前取消,无论它们是通过链接点击还是调用 Turbolinks.visit 发起的。

在访问即将开始时监听 turbolinks:before-visit 事件,并使用 event.data.url(或 $event.originalEvent.data.url,使用 jQuery 时)检查访问的位置.然后调用 event.preventDefault() 取消访问。

恢复访问不能被取消,也不能触发 turbolinks:before-visit。 Turbolinks 发出恢复访问以响应已经发生的历史导航,通常通过浏览器的后退或前进按钮。

通过监听visit 事件被触发并拦截它,您可以防止turbolinks 缓存页面。

【讨论】: