我有一个API gem,它是一个公共帮助程序库,它使用法拉第对我的API发出资源丰富的请求。我想制作一个中间件来检查会话数据是否存在(以散列的形式),如果是,则将这些值合并到法拉第所做的任何请求的参数中。
我最初的尝试涉及在gem的顶级类(即MyGem.global_params)中设置元类attr_accessor(global_params)。中间件可以检查此变量以获取必要的数据。这意味着任何有权访问我的库的ApplicationController都可以实现一个before_filter,它可以根据会话数据设置global_params,而after_filter可以清除它..所以这个ApplicationController实例发出的所有法拉第请求都会共享相同的global_params设置表单会话数据。
我现在想知道这是否是线程安全的..如果不是我可以处理的另一种方式呢?
答案 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可以拥有默认实例。