0

我观看了 Ryan Bates Railscast #388 关于多租户应用程序默认范围的内容。他使用子域来做到这一点。

出于几个原因,我希望能够在没有子域的情况下做到这一点。例如:

租户A.example.com --> example.com/tenantA

租户B.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. 覆盖_path_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)

在自动取款机上为我工作。虽然有点神奇,但不是很好。

于 2013-07-24T09:50:38.470 回答