如何以线程安全的方式将会话数据提供给我的ruby gem?

时间:2012-11-29 20:34:06

标签: ruby-on-rails ruby ruby-on-rails-3

我有一个API gem,它是一个公共帮助程序库,它使用法拉第对我的API发出资源丰富的请求。我想制作一个中间件来检查会话数据是否存在(以散列的形式),如果是,则将这些值合并到法拉第所做的任何请求的参数中。

我最初的尝试涉及在gem的顶级类(即MyGem.global_params)中设置元类attr_accessor(global_params)。中间件可以检查此变量以获取必要的数据。这意味着任何有权访问我的库的ApplicationController都可以实现一个before_filter,它可以根据会话数据设置global_params,而after_filter可以清除它..所以这个ApplicationController实例发出的所有法拉第请求都会共享相同的global_params设置表单会话数据。

我现在想知道这是否是线程安全的..如果不是我可以处理的另一种方式呢?

1 个答案:

答案 0 :(得分:0)

至于你的另一个问题,全局变量几乎总是做错了的标志,应该尽可能避免。

您需要的是一种工厂方法,可以根据需要自定义您的上下文。

例如,你可能会做这样的事情:

MyGem.global_arg = :foo
MyGem.new(...)

你可以做的是:

factory = MyGem.factory(:global_arg => :foo)

factory.new(...)

或者,为了保持类似的感觉:

factory = MyGem.factory do |factory|
  factory.global_arg = :foo
end

不是在MyGem中创建mattr_accessor,而是创建一个作为独立对象的MyGem可以拥有默认实例。