使用Rails存储线程安全的全局请求特定数据

时间:2014-07-24 23:08:28

标签: ruby-on-rails rest

我处理的很多Rails应用程序取决于一些特定于请求的参数(request_api_versionclient_ipdevice_id,...)。

现在,这些参数在每个方法调用中传递。那很重。是否有一种线程安全的智能方法将这些数据存储在某处以避免传递它们?

我关于MyApp.request_api_version这样的全局变量,但我不认为这是一种好的做法(不是线程安全的......)。

还有其他选择吗?

1 个答案:

答案 0 :(得分:5)

tl; dr使用request_store

长版本:Ruby中的线程有点像哈希(它们响应[][]=),您可以通过Thread.current访问当前线程。这使您可以在控制器中执行Thread.current[:client_ip] = request.ip之类的操作,然后在模型中执行client_ip = Thread.current[:client_ip]。这很有用,直到app服务器重用一个线程来处理第二个请求。然后混乱随之而来,宇宙被摧毁(或其他东西)。

request_store gem通过将每个请求包装在一个特殊的中间件中来处理这个问题,该中间件可以清理"发送HTTP响应后存储的任何内容。自己实现这一点非常简单,特别是如果你只使用几个变量。如果你想要一个更普遍有用的解决方案,只需使用gem。