0

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

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

我现在想知道这是否是线程安全的。如果不是,我可以用什么另一种方法来处理这个问题?

4

1 回答 1

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

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

于 2012-11-29T22:15:08.343 回答