我对遇到的问题有疑问。我正在尝试实现一个对象(单例)/线程,但是遇到了意外的行为。
例如,我们有以下代码
class Persistence
attr_accessor :data
def self.instance
Thread.current[:persistence_store] ||= Persistence.new
end
def self.clear
Thread.current[:persistence_store] = nil
end
def get_data(user_id = nil)
self.data ||= AnotherClass.get_advanced_data(user_id)
end
end
可以说有一个请求传入,并且控制器中有Persistence.instance.get_data(1)
(因此get_data仅执行一次)。
然后,我们再次在模型中进行Persistence.instance.get_data
,所有操作都可以按预期的方式从初始请求中加载数据。
但是可以说,用户在5分钟内执行了相同的请求。我发现保存在Persistence.instance.get_data(2)
中的值是来自第一个用户请求的值。 (实际上是Persistence.instance.get_data(1)
)。
rails是否会为每个请求创建一个新线程,以防止上述情况发生?
我发现的唯一解决方案是在执行Persistence.clear
的应用程序控制器中添加一个before_filter,然后所有操作都按预期进行。
我有点困惑为什么会出现这种现象。希望你理解我的问题。
谢谢!
答案 0 :(得分:0)
根据请求(而不是线程)滚动,创建Controller的新实例。我发现最好的解决方案是:https://github.com/steveklabnik/request_store