1

安静なリソースと通信するモデルのようなアクティブなリソースがあります。リソース パスにはいくつかの動的パラメーターがあるため、各リクエストの前にモデルにいくつかのクラス変数を設定しています。

私はこのようなものを持っています:

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 を設定する before フィルターがあります。

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 年前に書かれたものですが、リクエストごとにクラス変数を設定すると競合状態が発生する可能性があるということはまだありますか?

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

4

2 に答える 2

2

この質問に対する答えは、「標準のRailsアプリはシングルスレッドです」と述べています。詳しくはご確認ください。

于 2012-02-29T13:17:30.593 に答える
0

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

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

于 2012-02-29T13:41:18.020 に答える