我使用apartment
和devise
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
模式而不是租户特定模式中查找。如何解决这个问题?
答案 0 :(得分:0)
我已经解决了这个问题。上面粘贴的路由代码是从教程中复制的,但似乎apartment
gem与routes.rb
文件中的ActiveRecord本机查询不兼容。显然,Page.where()...
调用被映射到public
租户,而不是请求租户解析路由,所以我已经将数据库查询从路由器移动到控制器,在控制器中,租户转移正在正确应用。
我已经简化了我的路由规则如下,现在它正在工作,我可以通过我的控制器中的slug找到合适的页面:
get '/:slug' => 'pages#show'