Rails:多租户应用和动态路由

Rails: Multi-tenant app and dynamic routing

我使用 apartmentdevise gem 创建了一个多租户应用程序。因为,我使用的是 postgresql,apartment gem 将为每个租户创建单独的模式。我的数据库有几个 table,user table 在 public 命名空间中,而 pages table 在每个租户特定的模式中。我可以分别登录到每个租户,并可以为每个租户的页面 table 创建单独的记录。

现在,我希望这些页面可以像这样的格式访问 tenant1.example.com/page-slug-here 为此,我在 routes.rb 文件中遵循了以下规则:

Page.where.not(slug: nil).all.each do |page|
  get "/#{page.slug}", controller: "pages", action: "show", id: page.id
end

当应用程序是单租户时,这些路由规则工作正常,但在多租户中它不起作用并且抛出 "no route matches" 错误。

我的猜测是上述路由规则中的数据库调用正在查找 public 模式而不是特定于租户的模式。如何解决这个问题?

我已经解决了这个问题。上面粘贴的路由代码是从教程中复制的,但 apartment gem 似乎不能很好地与 routes.rb 文件中的 ActiveRecord 本机查询一起使用。显然,Page.where()... 调用被映射到 public 租户,而不是在解析路由时请求的租户,所以我将数据库查询从路由器移动到控制器,在控制器中,租户正在转移正确应用。

我已将我的路由规则简化如下,现在它可以正常工作了,我可以在我的控制器中通过 slug 找到合适的页面:

get '/:slug' => 'pages#show'