[英]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.