我使用的很多 Rails 应用程序都依赖于一些特定于请求的参数(request_api_version
、client_ip
、device_id
、... ).
目前这些参数在每个方法调用中传递。那是相当沉重的。是否有一种线程安全的智能方式将这些数据存储在某个地方以避免传递它们?
我虽然考虑过诸如 MyApp.request_api_version
之类的全局变量,但我不认为这是一个好的做法(不是线程安全的,...)。
还有其他选择吗?
最佳答案
tl;dr 使用 request_store .
长版本:Ruby 中的线程表现得有点像散列(它们响应 []
和 []=
),您可以通过 访问当前线程>Thread.current
。这使您可以在 Controller 中执行诸如 Thread.current[:client_ip] = request.ip
之类的操作,然后在您的模型中执行 client_ip = Thread.current[:client_ip]
之类的操作。在应用程序服务器重新使用一个线程来处理第二个请求之前,这非常有用。然后困惑接踵而至,宇宙被摧毁(或其他)。
request_store gem 通过将每个请求包装在一个特殊的中间件中来处理这个问题,该中间件在发送 HTTP 响应后“清理”您存储的任何内容。自己实现这个非常简单,尤其是当您只使用几个变量时。如果您想要一个更通用的解决方案,只需使用 gem。
关于ruby-on-rails - 使用 Rails 存储线程安全的全局请求特定数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24945456/