我想将自定义属性(哈希映射)注入我的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
文件中,但这也无效。
答案 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
,然后首先加载。