Ich habe eine Rails 4.2 Multi-Tenant-App mit dem Apartment Juwel, die super war.Erstellen Sie neue Mieter Apartment Gem - immer neu starten?
Jede Firma hat ihre eigene Subdomain. Ich verwende einen benutzerdefinierten "Aufzug", der den gesamten Anfrage-Host untersucht, um zu bestimmen, welcher "Mieter" geladen werden soll.
Wenn ich eine neue Firma erstelle, habe ich einen after_create-Hook, um den neuen Mandanten mit dem richtigen Anfrage-Host zu erstellen.
Dies scheint immer einen Neustart des Servers sowohl in der Entwicklung als auch in der Produktion erforderlich, sonst bekomme ich einen Mieter nicht gefunden Fehler.
Es verwendet sqlite in Entwicklung und Postgres in Produktion.
Muss ich den Server wirklich jedes Mal neu starten, wenn ich einen neuen Mandanten erstelle? Gibt es einen automatisierten Weg, dies zu tun? Vielleicht wird es einfach funktionieren, den Initialisierer neu zu laden, aber ich bin mir nicht sicher, wie das geht/wenn das möglich ist?
Ich habe seit einem Monat damit herumspielen und war nicht in der Lage, eine Lösung zu finden, die funktioniert. Bitte helfen Sie!
initializers/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
initializers/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
Firma Modell
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
Was Arbeits endete
Ich habe die Aufzugskonfiguration geändert, um von der HostHash-Version, die sich in der Wohnung befindet, wegzukommen und eine komplett benutzerdefinierte zu verwenden. Meist basiert weg von einem Problem auf der Wohnung gem Github: https://github.com/influitive/apartment/issues/280
initializers/apartment.rb
Rails.application.config.middleware.use 'BaseSite::BaseElevator'
app/Middleware/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
Ich habe keine Antwort auf Ihre spezifische Frage, aber gehen Sie voran und starten Sie Postgres in Ihrer Entwicklungsumgebung. Es kann dieses Problem zwar nicht lösen (aber vielleicht!), Aber es ist die beste Vorgehensweise für Ihr dev env. um Ihr Produkt zu imitieren. SQLite ist großartig für das Prototyping, aber sobald Sie sich bewegen, um zu prod, sollten Sie einen get dev im Einklang mit prod gehen. – Lumbee
vereinbart. Ich sollte das auf jeden Fall tun. Es ist definitiv auf meiner Agenda in der nächsten Woche zu tun. Dies war eine Side-Projekt-Produktions-App. –
Wäre hilfreich, um Aufzugscode zu sehen. \t Wie Lumbee darauf hingewiesen hat, sollten Sie Ihre Entwicklungsdatenbank auf PostgreSQL umstellen. Dies gilt insbesondere, wenn Sie den Apartment-Juwel benutzen. Wenn Sie einen neuen Mandanten erstellen, richtet Apartment ein neues Schema für diesen Mandanten in der Datenbank ein, und in SQLite erstellt es buchstäblich eine neue Datenbank für Datensätze, die den neuen Mandanten betreffen. Dies kann mühsam sein, manuell zu arbeiten, was die Schönheit von Apartment ist. ** Chris Oliver bei GoRails ** hat ein großartiges Beispiel, das das Konzept hier vereinfacht: https://gorails.com/episodes/multenancy-with- apartment –