Ruby on Rails - 指示来自服务器端的客户端刷新/警告的最佳实践



我们使用标准的rails服务器,在每个版本上,我们的应用程序.js版本都会根据需要自动更改

如果有全新部署,则对页面进行标准刷新将提取所需的文件。到目前为止没有问题。

现在,我们有一个仪表板,它有一个刷新按钮,它会触发 ajax 请求(统计/数据)并刷新页面的一部分。无需重新加载页面。但是发生的事情是有时客户端不会全天重新加载页面,在此期间,我们部署了最新的代码,它以不同的方式使用数据,而 ajax 请求(stats/data)虽然仍然是一个有效的 url,但现在在页面上给出了一个奇怪的错误,因为该代码已经过时并且数据的消耗方式不同。

此类问题的标准解决方案是什么?

a) 想知道我们是否可以在每次部署后使用套接字来通知客户端需要重新加载页面等

b) 我们可以以某种方式使用 http 缓存(无验证等),通知用户请求不再有效,他们需要重新加载页面。

*甚至不确定它的作用,以及它会起作用。在我们的 ajax 请求中,它甚至没有进入 if 块。

application_controller.rb
before_filter :set_cache_buster
  def set_cache_buster
    if request.xhr?
      response.headers["Cache-Control"] = "no-cache, no-store, max-age=0, must-revalidate"
      response.headers["Pragma"] = "no-cache"
      response.headers["Expires"] = "Fri, 01 Jan 1990 00:00:00 GMT"
    end
  end

欢迎任何建议...当我不得不告诉我的客户时,看起来真的很糟糕,嘿,请刷新页面,之后它会工作。如果我们做错了什么,请告诉我。

底线是你必须以一种或另一种方式通知客户端它需要刷新。您可以通过随 ajax 请求发送的标头、使用 ajax 请求发送的标志、websocket 等来执行此操作,但它必须来自某个地方。

另一种方法是让您的客户端或服务器始终向后兼容。我更喜欢这个选项,因为它对客户端的影响最小,但是,当这不可行时,如果我还没有为该 API 设置websocket 服务器,我会使用 websockets 或 ajax 请求标头。

websocket 解决方案的示例流程:

  1. 客户端连接到现有服务器,连接后会收到包含版本号的消息。
  2. 新代码将部署到服务器,从而导致重新启动。
  3. 重新启动会导致客户端断开连接并重新连接。
  4. 重新连接时,客户端会再次收到版本号,如果版本号足够不同,则会重新启动*。

* 不同,我的意思是,例如,它不需要

为 1.0.0 到 1.0.1 重新启动,但它需要为 1.0.0 到 1.1.0 重新启动

最新更新