1

我的 config.yml 文件看起来像这样

development: &development
  <<: *development
  sub1:
    sub11: "myemail@fiverr.com"
    sub12: "http://localhost"

staging:
  <<: *development
  sub1:
    sub12: "http://google.com"

production:
  <<: *development
  sub1:
    sub12: "http://youtube.com"

我像这样加载它

SETTINGS = YAML::load(File.open( "#{ROOT}/config/config.yml")).with_indifferent_access[ENV['RACK_ENV']] unless defined?(SETTINGS)

问题是在开发环境中:

SETTINGS[:sub1][:sub12] = "http://localhost"
SETTINGS[:sub1][:sub11] = "myemail@fiverr.com" 

并在登台环境中:

SETTINGS[:sub1][:sub12] = "http://google.com"
SETTINGS[:sub1][:sub11] = "nil" 

好像我不定义它就没了!

4

1 回答 1

1

当你有:

staging:
  <<: *development
  sub1:
    sub12: "http://google.com"

您合并development映射中的键,然后将sub1键的值设置为新sub12映射。请注意,这将替换从开发映射合并的整个原始地图。sub1映射不会递归合并。

它相当于纯 Ruby 中的类似内容:

development = {'sub1' =>
  {'sub11' => "myemail@fiverr.com", "sub12" => "http://localhost"}
}

staging = {}
staging.merge! development
staging["sub1"] = {"sub12" => "http://google.com"}

并且实际上在 Psych (Ruby 的 Yaml 库)中几乎以这种方式实现。

要修复它,您需要将锚添加到子哈希中:

development:
  sub1: &sub1defaults
    sub11: "myemail@fiverr.com"
    sub12: "http://localhost"

staging:
  sub1:
    <<: *sub1defaults
    sub12: "http://google.com"

production:
  sub1:
    <<: *sub1defaults
    sub12: "http://youtube.com"

不幸的是,如果您的配置中有许多这样的嵌套映射,这可能会涉及更多工作。

于 2013-01-18T18:32:13.450 回答