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 

を私はshop_idを設定し、フィルタの前に持っていると私はここから理解したよう

class ApplicationController < ActionController::Base 
    before_filter :set_site 

    private 

    def set_site 
    MyClass.set_site(current_shop.id, current_product.id) 
    end 
end 

をPRODUCT_ID:http://m.onkey.org/thread-safety-for-your-rails これは可能性がありいくつかの競争条件の原因。

この記事は3年前に書かれていますので、要求ごとにクラス変数を設定すると競合状態が発生する可能性がありますか?

もしそうなら、競合状態を引き起こさずに同様の動作を達成するための現在のベストプラクティスは何ですか?

答えて

2

questionの回答は、「標準のレールアプリはシングルスレッドです」と述べています。詳細はこちらをご覧ください。

0

要求ごとに異なる値を持つクラスにクラス変数を設定しないでください。

Railsは要求間でクラス変数を保持し、2つの異なるユーザーのセッション間でデータが漏洩しないことを保証することはできません。