在特定时间间隔后使会话变量的索引过期

Expiring an index of an session variable after a specific interval

我在 rails 应用程序上有一个 ruby,其中我有多个会话变量,其中我有一个特定的会话变量数组,我想每 10 秒删除一次它们的值已添加

例如我有一个会话变量

session[:somename] = ["0","1","2","3"]

现在我想在添加 10 秒后删除会话变量的索引,因此 0 应该在将其推送到会话后 10 秒后删除。有没有办法做到这一点?我可以为一个会话明确设置到期时间吗?或者有没有办法以任何其他形式然后使用会话来实现此目的?

感谢任何帮助,提前致谢

简短的回答是否定的。

默认情况下 rails 使用单个 cookie 将会话存储为序列化哈希。 cookie 本身可以有一个到期时间,在该时间点客户端拒绝整个会话 cookie 并且它不会发送回 rails。但是没有内置解决方案可以使会话中的单个值过期。

但是如果您有点创意,您可以将数组转换为一组对:

t = Time.current.to_i
["0","1","2","3"].map.with_index {|v, i| [v, t + ((i + 1) * 10) ]}
# => [["0", 1597863985], ["1", 1597863995], ["2", 1597864005], ["3", 1597864015]]

第二个值只是值过期时间的 unix 时间戳。然后,您将在读回时拒绝过期值:

Time.now.then { |t| serialized.reject{ |(v, e)| Time.at(e) < t } }