2016-04-14 7 views
4

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 
+0

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

+1

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. –

+0

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 –

Antwort

1

denke ich das Problem, dass sein könnte Ihre host_hash.rb lebt im Initialisierungsverzeichnis. Sollte es nicht in einem Ordner namens "Middleware" sein, wie in der Apartment gem ReadME Sie in Ihrem Kommentar verwiesen. In diesem Beispiel verwendeten sie app/middleware/my_custom_elevator.rb. Vielleicht könnte Ihre aussehen wie app/middleware/host_hash.rb?

Im Moment ist die Datei in Initialisierer, so dass es von dort geladen wird. Aber Ihre apartment.rb verweist darauf durch Rails.application.config.middleware.use. Nur eine Ahnung, aber neben dem Laden zunächst, es möglicherweise in einem nicht vorhandenen Middleware-Ordner suchen. Ich würde weiter gehen und App/Middleware erstellen, legen Sie die Datei stattdessen dort und sehen, was passiert. Nicht sicher, aber möglicherweise müssen Sie auch die Pfade require ändern.

Lassen Sie uns wissen, wenn das hilft.

+0

Danke! Ich habe es funktioniert. Hinzugefügt, wie genau ich es bei der Frage gemacht habe. Ich werde deine Antwort akzeptieren, weil sie mich auf den Weg gebracht hat, der zum Erfolg geführt hat. Grundsätzlich, wie ich den richtigen Mieter gefunden habe (außerhalb eines Initialisierers) und Ihre Empfehlung, ihn in das App/Middleware-Verzeichnis zu verschieben, wurde das behoben. –