簡體   English   中英

創建新的租戶公寓寶石 - 總是重啟?

[英]Creating New Tenant Apartment Gem - Always restart?

我有一個rails 4.2多租戶應用程序使用公寓寶石,這是非常棒的。

每家公司都有自己的子域名。 我正在使用一個自定義的“電梯”,它查看完整的請求主機以確定應該加載哪個“租戶”。

當我創建一個新公司時,我有一個after_create掛鈎來創建具有適當請求主機的新租戶。

這似乎總是需要在開發和生產中重新啟動服務器,否則我會收到Tenant Not Found錯誤。

它在開發中使用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,它位於公寓寶石中,並使用完全自定義的。 主要基於公寓gem 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

我認為問題可能是你的host_hash.rb存在於initializers目錄中。 根據您在評論中引用的Apartment gem ReadME ,它不應該位於名為“middleware”的文件夾中嗎? 在該示例中,他們使用了app / middleware / my_custom_elevator.rb 也許你的看起來像app / middleware / host_hash.rb

現在文件在初始化器中 ,所以它從那里加載。 但是你的apartment.rb通過Rails.application.config.middleware.use引用它。 只是一個預感,但除了最初加載它,它可能在一個不存在的中間件文件夾中尋找它。 我會繼續創建應用程序/中間件 ,將文件放在那里,看看會發生什么。 不確定,但您可能還需要更改require路徑。

如果有幫助,請告訴我們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM