Ruby on rails Rails,处理两个具有不同url和设计但具有相同db的站点

Ruby on rails Rails,处理两个具有不同url和设计但具有相同db的站点,ruby-on-rails,Ruby On Rails,我在寻找解决问题的最佳方法 目前我有一个客户网站,example.domain.com 我的客户要求创建另一个在设计上有所改变的网站,但内容与第一个网站相同。我不想复制网站,因为我添加到站点A的每个功能都必须部署到站点B,我正在寻找一种聪明的方法来处理这种情况 我需要保留两个不同的域,我还需要在控制器和一些模型中自定义邮件程序和其他小调整 我的想法是在像这样的过滤器之前放入应用程序控制器 在\u操作之前:检测\u域 私人的 def detect_domain case request.env

我在寻找解决问题的最佳方法

目前我有一个客户网站,example.domain.com

我的客户要求创建另一个在设计上有所改变的网站,但内容与第一个网站相同。我不想复制网站,因为我添加到站点A的每个功能都必须部署到站点B,我正在寻找一种聪明的方法来处理这种情况

我需要保留两个不同的域,我还需要在控制器和一些模型中自定义邮件程序和其他小调整

我的想法是在像这样的过滤器之前放入应用程序控制器

在\u操作之前:检测\u域

私人的

def detect_domain
  case request.env['HTTP_HOST']
  when "example.domain.com"
    request.variant = :host1
  when "example1.domain.com"
    request.variant = :host2
  end
end
然后我使用带有一些条件的变量来选择邮件程序、自定义视图和应用一些代码更改


还有其他想法吗?

使用before过滤器和每个请求变量(如您的提案)将起作用,我将在下面提到几个注意事项。我建议使用gem这样的工具来实际存储所选皮肤的每个请求值

现在,请注意。首先,每个请求变量的主要问题是Rails应用程序并不总是存在于请求的上下文中。后台作业和控制台会话在应用程序通常的请求/响应流之外运行。您需要考虑在未设置变量的情况下执行模型或其他非控制器/视图代码时会发生什么。我建议根本不要让您的模型依赖于RequestStore——如果需要,让控制器将任何特定于请求的信息向下传递到模型中

其次,从您的描述中不清楚您是否想要两个域之间的数据或逻辑分离,或者您只是想要不同的外观和感觉。如果是前者,您可以考虑GEM,其目的是使数据库多租户更容易。

编辑:我还想提到,作为上述多租户解决方案的替代方案,您还可以选择多实例解决方案。其中,您使用环境变量指示应显示站点的哪个版本,并在具有反向代理的同一服务器上,或在具有单独DNS条目或反向代理的单独服务器上启动应用程序的多个实例。缺点是基础设施成本增加,但是我上面提到的上下文问题已经不存在了,所有的东西都可以访问环境变量