Rails是否有一个每个请求存储,我可以添加对象和从中检索?

时间:2010-11-04 14:14:02

标签: ruby-on-rails

在asp.net中有一些名为Request.Items的东西,我可以添加一个对象,然后我可以检查一个对象是否存在于我的代码的另一部分的.Items集合中(就像在另一个类中一样) )。

Rails有这样的东西吗?

2 个答案:

答案 0 :(得分:2)

最受欢迎的选项之一是使用request_store gem,它允许您从代码的任何部分访问全局商店。它使用Thread.current来存储您的数据,并在每次请求后负责清理数据。

RequestStore[:items] = []

请注意,因为它使用Thread.current,所以在每个请求有多个线程的多线程环境中它无法正常工作。

为了解决这个问题,我实现了一个可以在线程之间共享同一请求的商店。它被称为request_store_rails,用法非常相似:

RequestLocals[:items] = []

答案 1 :(得分:0)

您可以定义一个类方法(在您想要的任何类中)来存储您的数据:

class Xyzzy
  def self.items
    @items ||= {}
  end
end
# ....
if Xyzzy.items.include? :fubar
  Xyzzy.items[:asd] = 1
end

但您应该决定何时清除此“缓存”。如果您只想要一个请求,请定义一个调用Xyzzy.items.clear

的before_filter

类对象是全局的。您也可以使用标准的全局变量,但这样不那么优雅。 :)