Rails 6. 浏览器打开后显示一个带有过期数据的页面

Posted

技术标签:

【中文标题】Rails 6. 浏览器打开后显示一个带有过期数据的页面【英文标题】:Rails 6. A page with outdated data is shown after the browser opening 【发布时间】:2021-05-14 13:54:41 【问题描述】:

有一个 Rails 网络应用程序。 每次我打开带有“启动时恢复上一个会话”选项(Chrome、Firefox、Edge)的浏览器时,我都可以看到包含过时数据(旧数字、文本等)的页面。我必须刷新页面才能看到实际数据。

有没有办法在浏览器打开时刷新页面? 也许有一个 Rails 设置......或者有一种方法可以使用 JS 做某事。

所以,基本场景是这样的:

打开一个包含一些数据的页面 关闭浏览器(不要关闭我们页面的标签) 更改此页面的数据(例如在 DB 中) 打开浏览器查看我们页面的状态

预期结果:页面包含相关(“新鲜”)数据。 实际结果:页面包含过期数据。

谁能帮我解决这个问题?

【问题讨论】:

【参考方案1】:

我找到了答案here。

class ApplicationController < ActionController::Base

  before_action :set_cache_headers

  private

  def set_cache_headers
    response.headers["Cache-Control"] = "no-cache, no-store"
    response.headers["Pragma"] = "no-cache"
    response.headers["Expires"] = "Mon, 01 Jan 1990 00:00:00 GMT"
  end
end

该解决方案已有 12 年历史,但仍然可行。

【讨论】:

【参考方案2】:

还没有遇到过这个问题,但是我可能会使用一些 JS 以某种方式处理它。

这可以简单到将page_generated_at 时间(作为unix 时间戳可能是为了避免需要日期时间格式处理)存储在页面某处(当页面从服务器呈现时),然后添加JS 以重新加载如果page_generated_at 时间比当前时间早 X 秒​​以上,则页面将是几行 JS。

【讨论】:

嗯...这其实是一个有趣的想法,但它并没有解决浏览器重新打开的问题。作为用户,我希望在浏览器打开后看到一个绝对相关的页面(其中包含以前的选项卡)。而且我什至不知道这是后端问题、前端问题还是浏览器配置问题。 是的,它更像是您可以运行的测试。 JS 是否在浏览器加载时运行?如果是这样,它应该为您提供相关页面(因为它会在浏览器打开时重新加载)。不过,也可能有一个 JS 事件可以挂钩,它可能会更好地工作(但仍需要 JS 才能运行)。至于来源,我会强烈倾向于浏览器配置,尽管它也可能是一个缓存标题问题(或者缺少它们,也许有一个“从不缓存”类型的标题会有所帮助),但也不要使用缓存标题就像我从事的大部分工作都不太适合浏览器缓存一样。 好吧,我不能要求我的客户以特定方式配置他们的浏览器。默认情况下,它应该在任何地方都可以工作。所以,如果有一个浏览器打开事件,它可以帮助我。【参考方案3】:

config/initializers/default_headers.rb(或类似的)中,输入以下内容:

Rails.application.config.action_dispatch.default_headers['Cache-Control'] = 'no-cache, no-store'

【讨论】:

以上是关于Rails 6. 浏览器打开后显示一个带有过期数据的页面的主要内容,如果未能解决你的问题,请参考以下文章

电脑显示网站证书过期怎么办?

在 Rails 6 中使用 activestorage 时,如何在重新显示表单时保留文件?

在 Rails 6 中更新底层模型时如何使动作缓存过期?

带有 JQuery 的 Rails 5:带有显示和隐藏 JQuery 切换的表单最初会显示,但在我刷新页面后会隐藏起来

SSL证书过期了怎么办

打开uc后无论打开啥网站都显示网络安全证书有问题,之前没遇到过,