Pomimo znalezienia wielu przykładów wielodostępności w aplikacjach Rails, kiedy po raz pierwszy zacząłem to robić, nie mogłem znaleźć takiego, który sprawiałby, że czułem się całkowicie komfortowo. Ale w końcu mam rozwiązanie, z którego jestem zadowolony.
Zacząłem od railscastu „wielodostępność z zakresami”
http://railscasts.com/episodes/388-multitenancy-with-scopes
następnie przyjrzeliśmy się możliwości pracy wielu najemcom z subdomenami Devise, korzystając z tego przewodnika:
Ale nie wziąłem tego za dobrą monetę; Zagłębiłem się, aby naprawdę zrozumieć, jak działa Devise.
Kiedy już to wszystko miałem na swoim miejscu, byłem gotowy na klejnot dla wielu najemców:
https://github.com/wireframe/multitenant
Ale nie poprzestałem na tym. klejnot multitenant wymaga, aby powiedzieć Multitenant.with_tenant za każdym razem, gdy chcesz, aby rzeczy miały odpowiedni zakres, więc stworzyłem TenantController, który wygląda tak:
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
a następnie dowolny kontroler, który chcę, aby był objęty zakresem, dziedziczy po TenantController, a nie ApplicationController. W ten sposób nie musiałem niczego zapamiętywać w szczegółach kontrolera, po prostu zadziałał. jedyną rzeczą, o której musieli pomyśleć programiści, było „czy to jest kontroler, który obsługuje dane najemców?”
Chociaż nadal zależy to od tego, czy programiści zrobią kilka rzeczy poprawnie (dziedziczenie po odpowiednim kontrolerze, powiedzenie „acts_as_multitenant” w modelu, w praktyce działa to naprawdę dobrze.