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

时间:2016-08-05 19:51:50

标签: ruby-on-rails ruby postgresql routing multi-tenant

我使用apartmentdevise gem创建了一个多租户应用。因为,我使用postgresql,apartment gem将为每个租户创建单独的架构。我的数据库作为几个表,user表位于公共名称空间中,而pages表位于每个特定于租户的模式中。我可以单独登录每个租户,并可以为每个租户的页面表创建单独的记录。

现在,我希望可以使用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

当应用程序是单租户时,这些路由规则工作正常,但在多租户中,它无法正常工作并且正在投掷"没有路由匹配"错误。

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

1 个答案:

答案 0 :(得分:0)

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

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

get '/:slug' => 'pages#show'
相关问题