在 Rails 应用程序中存储 Configatron 配置的正确/最佳位置是啥?

Posted

技术标签:

【中文标题】在 Rails 应用程序中存储 Configatron 配置的正确/最佳位置是啥?【英文标题】:What is the right /best place to store Configatron configuration in a Rails app?在 Rails 应用程序中存储 Configatron 配置的正确/最佳位置是什么? 【发布时间】:2011-12-07 01:30:10 【问题描述】:

我将configatron gem 用于由 ActiveRecord 备份的新 Rails 应用程序。我的一些配置器设置是在一个文件中设置的,一些是从数据库中提取的,因为它们会不时更改,这里有几行来自我的 configatron.rb

configatron.app.uptime.start = Time.now
configatron.email.signature = Setting.where(:keyname => "email_signature").first.value.to_s unless Setting.where(:keyname => "email_signature").first.nil?

由于这个应用程序从多个邮件程序发送多封电子邮件 - 这是将这个全局配置保存在一个地方的好方法,而且它减少了用于签名的数据库查找。如果由于某种原因站点管理员决定更改它 - 他们可以通过 Web 管理界面进行更改,该界面将更新我的设置表(绑定到设置模型)。

这一切都很好,但是存储 configatron.rb 的最佳位置是什么?现在它位于我的初始化程序文件夹中。这意味着它将在应用程序启动时加载一次 - 这很好,但是如果其中一项设置发生更改 - 站点管理员决定调整电子邮件签名以提及新的促销网站 - 为了使更改生效 - 我需要重新启动应用程序(正在运行的乘客 - 因此从代码中执行 touch tmp/restart.txt 很简单)。但是,这意味着我不会重置的其他配置器设置(例如我的正常运行时间开始时间戳)也将被重置。

那么有什么更好的地方来移动我的 configatron.rb 并从中加载,以便它允许 在启动时加载一次,然后在不重启应用的情况下更改一些配置?

谢谢。

【问题讨论】:

【参考方案1】:

我认为将它放在初始化程序中是存储它的正确位置。

如果您想在不重新启动应用程序的情况下更新配置,您通常会设置一个“看门狗”。一些定期拉取数据库以检查配置更新的过程。您还可以实现某种回调,将更改的配置推送到您的应用程序。

【讨论】:

【参考方案2】:

当我将配置器放入初始化程序时,Rails 环境变量会在加载配置器设置之前加载。因此,在 Rails 配置 (config/environments/production.rb) 中加载的中间件无法使用配置器变量。

所以我最终将它作为第一件事加载到 environment.rb 中

【讨论】:

这实际上是我想要的行为,因为我只在那里存储应用程序设置,需要在加载环境后加载。实际上基于应用程序所在的环境(产品与测试/开发)我加载不同的设置。

以上是关于在 Rails 应用程序中存储 Configatron 配置的正确/最佳位置是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Rails:如何在会话中存储数据?

在 Rails 中存储(结构化)配置数据的位置

在哪里存储 Rails 应用程序的版本

在 Rails 的会话中存储对象

在 Rails api 应用程序中存储会话

使用 Rails 5 在 Postgres 中存储字符串化 JSON