我在rails应用程序中使用了公寓gem。
我有一个数据库,每个租户都有模式,租户表有一个公共模式。
我已经排除了www子域名:
Apartment::Elevators::Subdomain.excluded_subdomains = ['www']
然后,如果我输入public.page.com
或www.page.com
,公寓将不会转换到另一个租户,但它将保留在公共租户。当然“公共”不是租户本身,只是租户之间的通用数据,所以,我不希望任何用户使用公共架构。
什么是正确的方法来避免这种情况?
此应用程序在AWS上运行,因此,路由53将阻止此操作,但是,尽管我想避免通过此子域服务请求的rails。
除了从公寓中排除域名,您需要将它们排除在路线之外。在我的项目中,我使用此代码来管理:
我正在使用初始化程序来创建excleded子域的数组。
# config/initializers/apartment/subdomain_exlusions.rb
Apartment::Elevators::Subdomain.excluded_subdomains = ['www', 'admin']
然后,我们可以在路由中的helper类中使用此数组。
# 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
方法