1

在Ruby的每個請求設置類變量,當我有一個像模型中的資源與寧靜的資源進行通信。 資源路徑有一些動態參數,所以我在每次請求之前在模型上設置一些類變量。如何避免競爭條件on Rails的

我有這樣的事情:

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 

在我的應用程序控制器I過濾器設置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年前所以它仍然是每個請求設置類變量可能導致競爭條件的情況下?

如果是這樣那麼什麼是實現類似的行爲,而不會導致競爭條件目前最好的做法?

回答

2

這個問題的答案question說,「一個標準的Rails應用程序是單線程的。」檢查它的細節。

0

不要爲這將有不同的要求不同的值設置類的類變量。

Rails會堅持要求之間的類變量,你將不能夠保證數據不會兩個不同用戶的會話之間泄漏。