2016-04-14 52 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

謝謝!我得到了它的工作。補充說明了我是如何處理這個問題的。我會接受你的回答,因爲它讓我走上了成功的道路。 基本上改變了我找到正確的租戶(在初始化程序之外)以及將其移到應用程序/中間件目錄的建議是修復它的原因。 –

相關問題