从DB中提取一些配置变量以在Rails环境中动态设置?

时间:2015-06-18 12:17:48

标签: ruby-on-rails ruby ruby-on-rails-4 ruby-on-rails-4.2

是否可以使用数据库中的值动态设置production.rb中的一些配置变量?

我正在构建一个多租户应用,每个租户都有一些需要动态设置的特定于环境的信息。

例如:

// production.rb
config.action_mailer.default_url_options  = { :host => current_tenant.domain }

current_tenantApplicationHelper中定义的辅助方法,因此无法在production.rb

中访问

以下是current_tenant

// application_helper.rb
def current_tenant
  @current_tenant ||= Tenant.find_by(domain: Apartment::Tenant.current)
end

如果没有,是否可以使用DB数据动态创建secrets.yml?从那以后,我可以在ENV

中使用production.rb

2 个答案:

答案 0 :(得分:0)

也许你可以试试这个: 为您的电子邮件创建帮助方法:

def build_tenant_url(route_name, *args)
  opts = args.extract_options!
  opts.merge!(host: @tenant ? @tenant.domain : your_domain)
  #Here you can merge other options if you need to pass a token etc
  Rails.application.routes_url_helpers.send(:"#{route_name}_url", *args, opts)
end

在邮件程序中,定义@tenant

然后在您的电子邮件视图中使用

= link_to 'Edit', build_tenant_url(:edit_tenant, @tenant) 

答案 1 :(得分:0)

此应用程序在应用程序启动时运行,因此如果您希望某个选项由某个变量驱动,则该变量将需要可用于启动时运行的Ruby代码。有各种方法可以做到这一点

  • 启动rails服务器的脚本(或其他)通过参数
  • 某个其他进程将值写入文本文件,并由启动脚本再次读出
  • 同样,但环境变量

例如,如果您在应用程序上为每个租户(用户组)提供了自己的子域,那么子域名可以用作启动代码的键,以读取数据库并为该租户提取一些详细信息。然后,当您将其旋转时,该子域将被传递到应用程序。

编辑 - 说完了所有这些,我不确定你是否有必要更改启动配置。您是否只是在发送电子邮件时查找相应的域名,而不是更改配置中的默认设置?