A pesar de encontrar muchos ejemplos de multiusuario en aplicaciones Rails cuando me propuse hacerlo por primera vez, tampoco pude encontrar uno que me hiciera sentir completamente cómodo. Pero finalmente tengo una solución con la que estoy contento.
Empecé con el Railscast 'multitenancy with scopes'
http://railscasts.com/episodes/388-multitenancy-with-scopes
luego analizó cómo hacer que la tenencia múltiple funcione con subdominios de diseño usando esta guía:
Pero no lo tomé al pie de la letra; Me sumergí para comprender realmente cómo funcionaba Devise de esa manera.
Una vez que tuve todo eso en su lugar, estaba listo para la gema multiusuario:
https://github.com/wireframe/multitenant
Pero no me detuve ahí. la gema multiinquilino requiere que diga Multitenant.with_tenant siempre que desee que las cosas tengan un alcance apropiado, por lo que creé un TenantController que se ve así:
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
y luego cualquier controlador que quiera que el inquilino tenga en el ámbito hereda de TenantController en lugar de ApplicationController. De esa manera, no tuve que recordar nada en los detalles del controlador, "simplemente funcionó". lo único en lo que los desarrolladores tenían que pensar era en '¿es este un controlador que maneja datos de inquilinos?'
Si bien esto todavía depende de que los desarrolladores hagan algunas cosas correctamente (heredando del controlador correcto, diciendo 'acts_as_multitenant' en el modelo, funciona muy bien en la práctica.