如何强制公共架构为默认架构Apartment Gem?

时间:2015-02-26 00:10:55

标签: ruby-on-rails apartment-gem

我正在使用Unicorn和Nginx的Apartment gem。我正在使用Subdomain电梯。在initializers/apartment/subdomain_exclusions我有Apartment::Elevators::Subdomain.excluded_subdomains = ['www']

我的理解是公共架构现在应该用于公共子域,www子域,或者没有子域,即mydomain.com。

然而,它并没有这样做。当我使用www或没有子域时,它使用最后访问的模式。因此,如果我只是使用另一个子域,它将使用该架构。这个不好。我甚至尝试添加config.default_schema = "public",但这没有任何效果。

为什么这不起作用的任何想法?有没有人以类似的方式设置它,并且在没有指定子域时只使用公共模式?是否可能是Nginx配置?

2 个答案:

答案 0 :(得分:4)

我知道这个答案有点晚了,但我遇到了类似的情况,并认为我会发布解决方案。

我们需要根据请求路径切换租户。我们的路线将租户名称附加到路径的前面(即/:tenant/some/action)。这样的问题是所有应用程序资产显然属于资产路径(即/assets/application.css)。此外,我们在/admin路径下放置了一个管理控制台。

要解决此问题,我使用了Generic中间件并传递了proc

config.middleware.use 'Apartment::Elevators::Generic',
                          Proc.new { |request|
                            path = request.path.split('/')[1]
                            Apartment.tenant_names.include?(path) ? path: 'public'
                      }

我如何处理路由:

scope path: ':tenant', defaults: {tenant: 'default_tenant_if_necessary'} do
    resources :model
end

答案 1 :(得分:0)

我认为这是因为它是如何在Generic电梯中实施的。如果找不到匹配的数据库,它不会将模式切换为默认值:

https://github.com/influitive/apartment/blob/development/lib/apartment/elevators/generic.rb#L21

我不确定这是一个错误或是故意做的。 我建议继承Subdomain电梯并覆盖调用方法。