【问题标题】:Rails: Multi-tenant app and dynamic routingRails:多租户应用程序和动态路由
【发布时间】:2016-12-12 07:38:42
【问题描述】:

我使用 apartmentdevise gem 创建了一个多租户应用程序。由于我使用的是 postgresql,apartment gem 将为每个租户创建单独的架构。我的数据库是几个表,user 表在公共命名空间中,而pages 表在每个租户特定的模式中。我可以分别登录每个租户,并且可以为每个租户的 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 架构而不是特定于租户的架构。如何解决这个问题?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-29
      • 1970-01-01
      • 1970-01-01
      • 2012-02-26
      • 1970-01-01
      • 1970-01-01
      • 2015-08-22
      • 1970-01-01
      相关资源
      最近更新 更多