2016-08-05 27 views
0

Ich habe eine Multi-Tenant-App mit apartment und devise gem erstellt. Da, ich benutze postgresql, apartment gem erstellt separate Schema für jeden Mieter. Meine Datenbank als einige Tabellen, user Tabelle ist im öffentlichen Namespace, während pages Tabelle in jedem mandantenspezifischen Schema ist. Ich kann mich für jeden Mandanten separat anmelden und separate Datensätze für die Seitentabelle jedes Mandanten erstellen.Schienen: Multi-Tenant-App und dynamisches Routing

Jetzt möchte ich diese Seiten für diese in einem Format wie diese tenant1.example.com/page-slug-here zugänglich sein, ich habe in meiner routes.rb Datei folgende Regel:

Page.where.not(slug: nil).all.each do |page| 
    get "/#{page.slug}", controller: "pages", action: "show", id: page.id 
end 

Diese Routing-Regeln funktionieren gut, wenn die App Single- war Mieter, aber in Multi-Tenancy funktioniert es nicht und wirft "no route matches" Fehler.

Meine Vermutung hier ist, dass der Datenbank-Aufruf in oben genannten Routing-Regel in public Schema statt Tenant-spezifischen Schema sucht. Wie behebe ich dieses Problem?

Antwort

0

Ich habe das Problem gelöst. Der oben eingefügte Routingcode wurde aus einem Lernprogramm kopiert, aber es scheint, dass das apartment Gem nicht gut mit den nativen Abfragen von ActiveRecord in der Datei routes.rb funktioniert. Anscheinend wurde der Page.where()... Anruf an public Mieter anstelle des angeforderten Mandanten an der Stelle der Auflösung von Routen zugeordnet, so habe ich die Datenbankabfrage von Router zu Controller und in Controller die Mieterschicht wurde korrekt angewendet.

Ich habe meine Routing-Regel wie folgt vereinfacht und jetzt funktioniert es und ich kann entsprechende Seite von Slug in meinem Controller finden:

get '/:slug' => 'pages#show'