Ruby on rails rails:yml合并

Ruby on rails rails:yml合并,ruby-on-rails,ruby,yaml,erb,Ruby On Rails,Ruby,Yaml,Erb,假设我有一个用于rails配置的yml文件 settings.yml defaults: &defaults interceptor_email: robot@wearemanalive.com development: <<: *defaults test: <<: *defaults production: <<: *defaults development: interceptor_email: userfoo@dom

假设我有一个用于rails配置的yml文件

settings.yml

defaults: &defaults
  interceptor_email: robot@wearemanalive.com

development:
  <<: *defaults

test:
  <<: *defaults

production:
  <<: *defaults
development:
  interceptor_email: userfoo@domain.com

如何合并这些密钥?我正在使用esb处理我的yml文件,所以这也是一个选项。只是想不出怎么做。我有它的设置,所以如果我的环境中缺少一个密钥,密钥将返回默认值。

您不能分别读取这两个yml文件吗

settings = YAML.load(path_to_settings)[RAILS_ENV].symbolize_keys
user_settings = YAML.load(path_to_user_settings)[RAILS_ENV].symbolize_keys
settings.merge!(user_settings)
现在您应该有了设置的散列值,然后您可以根据需要合并散列。如果第二个散列与第一个散列具有相同的密钥,则第一个散列将被覆盖。

我就是这样做的(免责声明,我刚刚编写了它,因此它还没有单元测试等…我将在改进后更新它):

你可以这样称呼它:

config = YourNamespace::Config.new 'config.yml'

# or have the second one override the first
#
config = YourNamespace::Config.new [ 'config-defaults.yml', 'config.yml' ]
如果你想变得花哨,这里还有很大的改进空间。理想情况下,使“Config”成为一个不处理文件的接口,并在
YamlConfig
IniConfig
CliConfig
DbConfig
CookieConfig
中实现。这样,如果有一天你决定新的配置格式超级种子yaml是如此的酷,你可以很容易地改变它而不破坏任何东西。您可以让命令行配置选项轻松覆盖来自配置文件的选项。无论配置值来自何处,您都可以对任何ruby项目重用配置模块。或者干脆停下来。快速浏览会让我觉得那里有很多热水

接下来编写一些文档、单元测试、输入验证、错误处理,并为配置值创建一些奇特的读/写访问器。也许您希望能够请求这样的配置值,而不是一直编写数组和散列:

config.get 'app.component.section.setting' 

# or this if you want to keep them separate:
#
config.get( 'app', 'component', 'section', 'setting' ) 

问题是,当这些定义位于
locale.yml
中时,您无法真正合并文件,因为没有要合并的内容。
deep\u merge
会阻止后者覆盖前者,因此如果设置具有development.unique\u变量,用户_设置不会使其无效,因为它的开发集合中不包含它。如何将它放在bash脚本的一行中?另请参见gem这是一个简洁的答案,可能与原始海报的用例不符,但减少为:merge似乎是一个很好的扁平散列的方法。
config.get 'app.component.section.setting' 

# or this if you want to keep them separate:
#
config.get( 'app', 'component', 'section', 'setting' )