2

これがグローバル オブジェクトに関する 1001 番目の質問であることはわかっていますが、私の状況は少し異なると思います。

私は、単一の Rails アプリケーション内でいくつかの異なるショップを提供する e コマース ソリューションに取り組んでいます。

ショップ固有のロジックとオプションを提供するクラス Shop があります。例えば:

@shop.taxモデルでアクセスできる必要があります。税金はショップによって異なる場合があります。例: 9%、18%。

@shop.name@shop.layoutコントローラーとビューでアクセスできる必要があります。

@shop.email.generalメーラー用。

アプリケーション コントローラーで Shop のインスタンスを作成し、何らかの形でそれをすべてのアプリケーション パーツに渡す必要があります。

# controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_filter :set_shop

  protected

  def set_shop
    requested_shop = if request.domain.match(/^.*shop1\.com$/)
      :shop_1
    elsif request.domain.match(/^.*shop2\.com$/)
      :shop_2
    end
    @shop = Shop.new(requested_shop)
  end
end

リクエストベースのロジックをモデルで使用すべきではないことはわかっていますが、そこにはショップ オプションが本当に必要です。テストでは、この「グローバル」オブジェクトShop.new(:test_shop)を spec_helper のようにモックできます。

グローバル変数は私の唯一の選択肢ですか? 私はそれらを使用したことがありません。

私は Settingslogic gem を使用しようとしましたが、ショップ固有のオプションの attr_accessors を定義し、それらはリクエスト間で持続します。これは私が必要としているものではありません。

4

1 に答える 1

1

これを行う1つの方法は、次のようになります。

class Shop
  def self.current=(shop)
    Thread.current[:current_shop] = shop
  end

  def self.current
    Thread.current[:current_shop]
  end
end

これにより、リクエストごとに個別の現在のショップを維持できます。

別の方法は、現在の店を回ることです。最初は退屈に思えるかもしれませんが、最終的には、グローバルまたは疑似グローバルな動作よりも推論が簡単になる可能性があります

于 2013-03-09T12:59:32.243 に答える