我有一个类似的问题,就是不愿意在每个路由助手调用中包含我的范围,因此我编写了以下助手:
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
和_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)
在自动取款机上为我工作。虽然有点神奇,但不是很好。