0

マルチテナント アプリのデフォルト スコープに関する Ryan Bates Railscast #388 を見ました。彼はサブドメインを使用してそれを行います。

いくつかの理由から、サブドメインなしで実行できるようにしたいと考えています。例えば:

tenantA.example.com --> example.com/tenantA

tenantB.example.com --> example.com/tenantB

残念ながら、これを行うために思いついた唯一の方法は、routes.rb ファイルのテナント リソース内にすべてのリソースをネストすることです。これには、ネストされた優先ルートよりも深く作成する必要があるという副作用があります。

すべてのルートヘルパーでこれを渡す必要がないように、デフォルトルートの親を定義する方法があるかどうか疑問に思っています。

4

1 に答える 1

0

私は、すべてのルート ヘルパー呼び出しに自分のスコープを含めることを嫌うという同様の問題を抱えていたので、次のヘルパーを作成しました。

module OverrideRoutesHelper
  %w(foo foo_bar).each do |resource|
    module_eval <<-EOT, __FILE__, __LINE__ + 1
      def #{resource}_path(*args) do_dat_thang!("#{resource}", *args) || super end
      def #{resource}_url(*args) do_dat_thang!("#{resource}", *args) || super end
    EOT
  end

  def do_dat_thang!(resource, obj, *args)
    if obj.is_a?(Integer)
      model = resource.split('_')[0].classify.constantize
      obj = model.find(obj)
    end
    send("tenant_#{resource}_path", obj.tenant, obj, *args)
  end
end

これが何をするか:

  1. 最初の行で指定したヘルパー リソースを受け取ります ( foo, foo_bar)
  2. _pathand_urlヘルパーをオーバーライドします
  3. 渡されたオブジェクトがテナント関連付け呼び出しdo_dat_thang!に応答することを確認する呼び出し (それが実際に関連付けの名前である場合)
  4. 存在する場合は、最初に渡した引数を使用して 、 などを呼び出しtenant_foo_path、最初のオブジェクト引数のtenant_foo_bar_path呼び出しから取得したテナントを先頭に追加します。tenant

たとえば、次のようになります。

foo_path(@foo)
=> tenant_foo_path(@foo.tenant, @foo)

foo_bar_url(@foo, @bar)
=> tenant_foo_bar_url(@foo.tenant, @foo, @bar)

また、代わりに ID を指定すると..

foo_bar_path(1, 2)
=> tenant_foo_bar_path(Foo.find(1).tenant, Foo.find(1), 2)

私のatmの御馳走を働いています。それはちょっと魔法ですが、それは素晴らしいことではありません。

于 2013-07-24T09:50:38.470 に答える