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)

問題は、開発中の env です:

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

およびステージング env で:

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 に答える