我正在Rails应用程序中使用公寓宝石。
我有一个数据库,其中每个租户都有架构,而租户表有一个公共架构。
我已经排除了www子域:
Apartment::Elevators::Subdomain.excluded_subdomains = ['www']
然后,如果我输入public.page.com
或www.page.com
,Apartment将不会切换到另一位租户,但它将留在公共房间。当然,“公共”本身不是租户,而只是租户之间的公共数据,因此,我不希望任何用户使用公共架构。
避免这种情况的正确方法是什么?
此应用程序在AWS上运行,因此,路由53将阻止这种情况,但是,尽管我希望避免Rails通过该子域提供请求。
答案 0 :(得分:1)
除了从Apartment中排除域外,您还需要将其从路由中排除。 在我的项目中,我正在使用以下代码进行管理:
我正在使用初始化程序创建排除的子域数组。
# config/initializers/apartment/subdomain_exlusions.rb
Apartment::Elevators::Subdomain.excluded_subdomains = ['www', 'admin']
然后,我们可以在路由的辅助类中使用此数组。
# config/routes.rb
class ExcludedSubdomainConstraint
def self.matches?(request)
request.subdomain.present? && !Apartment::Elevators::Subdomain.excluded_subdomains.include?(request.subdomain)
end
end
Rails.application.routes.draw do
constraints ExcludedSubdomainConstraint do
# here routes that are accessible in subdomains
end
end
作为奖励,您可以将排除的子域路由到另一个约束
class DashboardSubdomainConstraint
def self.matches?(request)
Apartment::Elevators::Subdomain.excluded_subdomains.include?(request.subdomain) || request.subdomain == ''
end
end
constraints DashboardSubdomainConstraint do
namespace :dashboard do
get '/settings'
end
end
将为您提供类似www.domain.com/dashboard/settinigs的路由,并可以访问公共租户。
提示。您可以在关注中使用其他root
方法