私は、すべてのルート ヘルパー呼び出しに自分のスコープを含めることを嫌うという同様の問題を抱えていたので、次のヘルパーを作成しました。
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
これが何をするか:
- 最初の行で指定したヘルパー リソースを受け取ります (
foo
, foo_bar
)
_path
and_url
ヘルパーをオーバーライドします
- 渡されたオブジェクトがテナント関連付け呼び出し
do_dat_thang!
に応答することを確認する呼び出し (それが実際に関連付けの名前である場合)
- 存在する場合は、最初に渡した引数を使用して 、 などを呼び出し
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の御馳走を働いています。それはちょっと魔法ですが、それは素晴らしいことではありません。