我们的应用程序是医院的Saas,已为所有客户部署在一个生产服务器上(与Linux + nginx + puma相同的代码)。默认情况下,其中有三个:测试,开发和生产。但在本例中,我们有10个环境配置文件指向文件夹“ config / environments /”中的10个客户端配置文件。并且我们给医院名称加上环境文件,例如
config/environments/hospital1.rb
config/environments/hospital2.rb
config/environments/hospital3.rb
...
[engine
开发了几种付费功能。
现在想象,医院1为功能1支付了费用。如何仅针对医院1激活功能1?我目前正在Gemfile中执行此操作
group :hospital1 do
gem 'feature1', path to ....
end
问题:这是将生产环境替换为特定于客户的环境并能够启用/禁用GEMFILE中的gem的好方法吗?
欢迎任何建议!
我个人更喜欢将环境视为技术级别的东西,而不是应用程序逻辑的东西。因此,我将尝试保持尽可能少的环境。如果您想在Gemfile
中使用条件语句,也许最好使用环境变量?有点像
if ENV['FEATURE_1_ENABLED']
gem 'feature1', path to ....
end
您甚至可以通过每家医院拥有一个.env
文件并使用Dotenv.load
加载适当的文件来自动管理这些变量。
这听起来是个坏主意。
您在这里“混合橘子和沙发”。环境和客户端具有不同的语义。
您拥有的是同一应用程序部署在不同服务器上的不同实例(然后,特定于客户端的内容应来自环境变量),或者如果是单个部署(看起来像您的情况),则客户端-具体设置应存储在数据库中。
关于限制对付费功能的访问,您应该研究像pundit这样的解决方案。 Gemfile
绝对不是适合您的业务逻辑的地方!