我有一个活动资源,比如模型,它与一个宁静的资源进行通信。 资源路径有一些动态参数,所以我在每个请求之前在模型上设置一些类变量。
我有这样的事情:
class MyClass << MySuperClass::Base
class << self
attr_accessor :site
attr_accessor :shop_id
attr_accessor :product_id
def get
RestClient.get(self.site)
end
def set_site(shop_id, product_id)
self.site = "http://example.com/api/shop/#{shop_id}/product/#{product_id}
end
end
end
在我的应用程序控制器中,我有一个设置shop_id和product_id的前置过滤器
class ApplicationController < ActionController::Base
before_filter :set_site
private
def set_site
MyClass.set_site(current_shop.id, current_product.id)
end
end
据我所知:http://m.onkey.org/thread-safety-for-your-rails 这可能是一些竞争条件的原因。
那篇文章写于3年前,所以仍然存在每个请求设置类变量可能导致竞争条件的情况?
如果是这样,那么在不招致竞争条件的情况下,目前实现类似行为的最佳做法是什么?
答案 0 :(得分:2)
对此question的回答是,“标准的rails应用程序是单线程的。”查看详细信息。
答案 1 :(得分:0)
不要为不同请求具有不同值的类设置类变量。
Rails会在请求之间保留类变量,并且您将无法保证数据不会在两个不同用户的会话之间泄漏。