2016-04-14 86 views
4

我有一个轨道4.2多租户应用程序使用公寓宝石已经很棒。创建新的租户公寓宝石 - 总是重新启动?

每个公司都有自己的子域。我正在使用一个自定义的“电梯”来查看完整的请求主机,以确定应该加载哪个“租户”。

当我创建一个新公司时,我有一个after_create挂钩来创建具有正确请求主机的新租户。

这似乎总是需要重新启动服务器,无论是在开发和生产,否则我得到一个租户未找到错误。

它在开发中使用sqlite和生产中的postgres。

每当我创建新租户时,是否真的必须重新启动服务器?有没有一种自动化的方式来做到这一点?也许只是重新加载初始化工具,但我不知道如何做到这一点/如果这是可能的?

我一直在为此乱搞一个月,一直没有找到可行的解决方案。请帮忙!

初始化/ apartment.rb

require 'apartment/elevators/host_hash' 

config.tenant_names = lambda { Company.pluck :request_host } 

Rails.application.config.middleware.use 'Apartment::Elevators::HostHash', Company.full_hosts_hash 

初始化/ host_hash.rb

require 'apartment/elevators/generic' 

module Apartment 
    module Elevators 
    class HostHash < Generic 
     def initialize(app, hash = {}, processor = nil) 
     super app, processor 
     @hash = hash 
     end 

     def parse_tenant_name(request) 
     if request.host.split('.').first == "www" 
      nil 
     else 
      raise TenantNotFound, 
       "Cannot find tenant for host #{request.host}" unless @hash.has_key?(request.host) 
      @hash[request.host] 
     end 
     end 
    end 
    end 
end 

公司型号

after_create :create_tenant 


def self.full_hosts_hash 
    Company.all.inject(Hash.new) do |hash, company| 
     hash[company.request_host] = company.request_host 
     hash 
    end 
end 

private 

    def create_tenant 
     Apartment::Tenant.create(request_host) 
    end 

什么结束了工作

我改变了电梯配置,以摆脱位于公寓宝石中的HostHash,并使用了完全自定义的电梯配置。主要是基于对断公寓宝石GitHub的一个问题:https://github.com/influitive/apartment/issues/280

初始化/ apartment.rb

Rails.application.config.middleware.use 'BaseSite::BaseElevator' 

应用/中间件/ base_site.rb

require 'apartment/elevators/generic' 

module BaseSite 
    class BaseElevator < Apartment::Elevators::Generic 
     def parse_tenant_name(request) 
      company = Company.find_by_request_host(request.host) 

      return company.request_host unless company.nil? 

      fail StandardError, "No website found at #{request.host} not found" 
     end 
    end 
end 
+0

我没有回答您的具体问题,但继续并开始在您的开发环境中运行Postgres。它可能无法解决这个问题(但它可能!),但它的开发环境的最佳实践。模仿你的prod env。 SQLite非常适合原型设计,但是一旦你的应用程序开始推出,你应该继续开发与产品一致的开发工具。 – Lumbee

+1

同意。我绝对应该这样做。我的议程在下周完成。这是一个侧面项目变成了生产应用程序。 –

+0

看到电梯代码会很有帮助。正如Lumbee指出的那样,您应该继续并将您的开发数据库更改为PostgreSQL。使用公寓宝石时尤其如此。当你创建一个新的租户时,Apartment为数据库中的Tenant设置一个新的模式,并在SQLite中为它创建一个新的数据库以记录与新租户相关的记录。这可能是一个手动工作的痛苦,这是公寓的美丽。 ** GoRails **的Chris Oliver有一个很好的例子,它简化了这里的概念:https://gorails.com/episodes/multitenancy-with-apartment –

回答

1

我想问题可能是您的host_hash.rb位于初始化程序目录中。它不应该放在名为“中间件”的文件夹中吗?按照您在评论中引用的Apartment gem ReadME。在那个例子中,他们使用app/middleware/my_custom_elevator.rb。也许你的看起来应该是app/middleware/host_hash.rb

现在文件在初始化程序,所以它从那里加载。但是你的apartment.rbRails.application.config.middleware.use引用它。只是一个预感,但除了最初加载之外,它可能正在寻找一个不存在的中间件文件夹。我会继续创建应用/中间件,将文件放在那里,然后看看会发生什么。不确定,但您可能还需要更改require路径。

让我们知道是否有帮助。

+0

谢谢!我得到了它的工作。补充说明了我是如何处理这个问题的。我会接受你的回答,因为它让我走上了成功的道路。 基本上改变了我找到正确的租户(在初始化程序之外)以及将其移到应用程序/中间件目录的建议是修复它的原因。 –