Rails 中的单例类是跨会话共享的



在我们的应用程序中,我们希望存储一些可以从该类中检索的类的信息,并且我们不希望每次都必须将此信息传递给该类...我们希望设置它一次,并且从那时起,只要我们请求该类,它就可以使用。这是因为我们希望类具有状态!

因此,我们研究了使用 Singleton 类来处理这个问题:

module ExampleModule
class ExampleClass
include Singleton
attr_accessor :field_one, :field_two
end
end

然后在我们的ApplicationController中,我们做了这样的事情:

instance = ExampleModule::ExampleClass.instance
instance.field_one = 'field_one'
instance.field_two = 'field_two'

现在我们随时这样做:ExampleModule::ExampleClass.instance

我们可以访问为两个字段设置的参数,而不必将它们传递回我们想要实现的类。

然而,我们的问题是...如果用户 1 访问我们的网站,然后设置这些值......然后用户 2 访问我们的网站,我们希望为此类设置不同的值......实际上会发生什么?它会覆盖其他用户的实例值吗?或者此单例类是否在用户会话之间保持独立?

如果要存储多个请求期间可用的信息,则需要将其保存在 Rails 进程外部的存储中。您无法保证来自同一用户的后续请求将被代理到同一进程(通常它可以路由到位于另一台服务器上的进程(。如果要在请求之间共享数据,请将其保存在数据库/redis/任何存储中,并将用户会话ID作为密钥。

最新更新