在初始化程序运行之前添加到Rails.application.config

时间:2015-01-31 12:47:27

标签: ruby-on-rails

我想将自定义属性(哈希映射)注入我的Rails.application.config。似乎这样做的方法只是在environment.rb中分配一个新变量:

Rails.application.config.feature_map = { :email => true }

我需要通过应用程序中的各个位置访问此地图,例如用户模型,控制器和rake任务。

其他宝石,例如devise,也需要访问它。问题是在应用程序生命周期中将它添加到environment.rb似乎太早了。

我在initializers/devise.rb中有这样的代码:

if Rails.application.config.feature_map[:email] = true

服务器抱怨此字段不存在。

我还使用它在我的用户模型中添加额外的验证:

if Rails.application.config.feature_map.enabled?(:username)
validates_length_of :username, :in => 3..50

我在这里也遇到关于undefined feature Rails.application.config.feature_map

的运行时错误

我可以在哪里移动它,以便我可以在初始化器和模型类中尽早访问它?我尝试将其移动到新的initializers/feature_map.rb文件中,但这也无效。

3 个答案:

答案 0 :(得分:2)

将它放在config / application.rb中:

module MyRailsApp
  class Application < Rails::Application
    config.feature_map = ActiveSupport::OrderedOptions.new
    config.feature_map.email = true
  end
end

您在其中设置的任何内容都将是所有环境的默认设置,但可以在config / environments / *中为每个环境覆盖。\ n \ r。

答案 1 :(得分:0)

像Figaro和.env这样的宝石会在加载initializer之前帮助你加载你的配置.rb

除非有充分的理由说你不想使用环境变量,否则我建议使用其中任何一种宝石,因为它们是添加自定义配置的推荐方法。

答案 2 :(得分:0)

编辑:请参阅上面的Jimmy Cuadra的答案,我最终会这样做。

我找到了另一种解决方案:this answer来操纵初始化器的顺序。

我可以将初始化程序重命名为00_feature_map.rb,然后首先加载。