【发布时间】:2015-08-28 19:19:18
【问题描述】:
我们使用标准的 Rails 服务器,并且在每个版本中,我们的 application.js 版本都会根据需要自动更改
如果有新的部署,则标准刷新页面将获取所需的文件。到目前为止没有问题。
现在,我们有一个仪表板,它有一个刷新按钮,它触发一个 ajax 请求(统计数据/数据)并刷新页面的一部分。无需重新加载页面。但是发生的情况是有时客户端不会在一天中重新加载页面,在此期间,我们部署了以不同方式使用数据的最新代码,以及 ajax 请求(统计数据/数据)虽然仍然是有效的 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请求返回一个版本号,如果页面加载时与html返回的版本号不匹配,则导致页面刷新。
-
@KevinB - 这是标准方式吗?我以为会有一些非常简单的事情我完全没有注意到
-
我不知道这样做的“标准方式”,我倾向于避免盲目地遵循别人认为的“标准”。
-
事实上,您需要某种方式来通知客户它已过时。有很多方法可以做到这一点,您只需要决定哪一种最适合您的情况。
-
@KevinB - 但是你们不要面对这个问题......以角度为例......我有一个使用最新代码的创建过程,我添加了另一个字段。服务器 api 现在需要这个字段,否则它会给出错误.....客户端点击服务器,尽管在 UI 上成功验证(因为他没有刷新页面)浏览器返回这个字段没有不存在错误....我在主要网站上看不到这种情况,所以想知道我哪里出错了。
标签: ruby-on-rails ajax sockets caching http-headers