Rails: мультитенантное приложение и динамическая маршрутизация

Я создал мультитенантное приложение, используя apartment и devise gem. Поскольку я использую postgresql, apartment gem создаст отдельную схему для каждого клиента. Моя база данных в виде нескольких таблиц, таблица user находится в общедоступном пространстве имен, тогда как таблица pages находится в схеме для каждого клиента. Я могу входить в систему для каждого арендатора отдельно и могу создавать отдельные записи для таблицы страниц каждого арендатора.

Теперь я хочу, чтобы эти страницы были доступны в формате, подобном этому tenant1.example.com/page-slug-here, для этого я следую правилу в моем routes.rb файле:

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

Эти правила маршрутизации работали нормально, когда приложение было однотенантным, но в мультитенантном режиме оно не работает и выдает ошибку «Нет совпадений маршрута».

Я предполагаю, что вызов базы данных в приведенном выше правиле маршрутизации просматривается в схеме public, а не в схеме для конкретного клиента. Как исправить эту проблему?


person Faisal Khurshid    schedule 05.08.2016    source источник


Ответы (1)


Я решил проблему. Вставленный выше код маршрутизации был скопирован из учебника, но кажется, что гем apartment не работает с собственными запросами ActiveRecord в routes.rb файле. По-видимому, вызов Page.where()... был сопоставлен с public арендатором вместо запрошенного арендатора в точке разрешения маршрутов, поэтому я переместил запрос к базе данных с маршрутизатора на контроллер, и в контроллере смена арендатора применялась правильно.

Я упростил свое правило маршрутизации следующим образом, и теперь оно работает, и я могу найти соответствующую страницу по ярлыку в своем контроллере:

get '/:slug' => 'pages#show'
person Faisal Khurshid    schedule 06.08.2016