Rails:多租户应用和动态路由
Rails: Multi-tenant app and dynamic routing
我使用 apartment
和 devise
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'
我使用 apartment
和 devise
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'