Obwohl ich viele Beispiele für Mandantenfähigkeit in Rails-Anwendungen fand, als ich mich zum ersten Mal damit beschäftigte, konnte ich auch keines finden, bei dem ich mich vollkommen wohl fühlte. Aber ich habe endlich eine Lösung, mit der ich zufrieden bin.
Begonnen habe ich mit dem Railscast „Mandantenfähigkeit mit Scopes“
http://railscasts.com/episodes/388-multitenancy-with-scopes
Dann haben wir uns angesehen, wie man Mandantenfähigkeit mit Devise-Subdomains mithilfe dieser Anleitung zum Laufen bringt:
https ://github.com/plataformatec/devise/wiki/How-To:--Isolate-users-to-log-in-to-a-single-subdomain
Aber ich habe das nicht für bare Münze genommen; Ich habe mich vertieft, um wirklich zu verstehen, wie Devise so funktioniert.
Nachdem ich all das eingerichtet hatte, war ich bereit für das mandantenfähige Juwel:
https://github.com/wireframe/multitenant
Aber ich habe hier nicht aufgehört. Das Multitenant-Gem erfordert, dass Sie Multitenant.with_tenant sagen, wann immer Sie möchten, dass der Bereich angemessen ist, also habe ich einen TenantController erstellt, der so aussieht:
around_filter :scope_current_tenant
def scope_current_tenant
begin
Firm.current = Firm.find_by_subdomain!(request.subdomain)
rescue
raise ActionController::RoutingError.new('Not Found')
end
Multitenant.with_tenant Firm.current do
yield
end
ensure
Firm.current = nil
end
end
und dann erbt jeder Controller, den ich vom Mandanten erfassen möchte, eher von TenantController als von ApplicationController. Auf diese Weise musste ich mir an die Details des Controllers nichts merken, es funktionierte einfach. Das Einzige, woran Entwickler denken mussten, war:„Ist das ein Controller, der Mandantendaten verarbeitet?“
Dies hängt zwar immer noch davon ab, dass Entwickler ein paar Dinge richtig machen (vom richtigen Controller erben und im Modell „acts_as_multitenant“ sagen, aber in der Praxis funktioniert es wirklich gut.