2017-05-03 3 views
0

YAMLファイルを継承していますので、プログラムでキーを追加または編集したいと思います。 YAML.loadメソッドを使用してYAMLをハッシュにロードしますが、YAML.dumpを使用してハッシュを保存すると、すべての継承情報が失われます。継承を使ってYAMLをルビに保存する

継承情報を失うことなくRubyでYAMLを編集する方法はありますか?

YAML例:

main: 
    prod: &prod 
    key1: true 
    key2: 50 
    key3: "abc" 

    prod_v_3_5: &prod_v_3_5 
    <<: *prod 
    key2: 100 


    prod_v_3_6: &prod_v_3_6 
    <<: *prod_v_3_5 
    key2: 150 

コード例:

config = Api.get(id) 
yaml = YAML.load(config) 
yaml["main"][section].store(key, value) 
config = YAML.dump(yaml) 
Api.set(id, config) 
+0

を例に、編集したいファイルとあなたが試みたが失敗したいくつかのコードを共有してください。 –

+0

[YAML仕様](http://yaml.org/spec/1.2/spec.html)には、継承は一度しか記述されていません。したがって、記事を紛失していることを除けば、 "私はYAMLファイルを継承しています"と言っても意味がありません。投稿を編集して継承の意味を含めてください。 – Anthon

答えて

0

を私の知る限りではYAMLのソースが読み込まれ、(私も輸入オーバーライドにそのオプションを使用します)ハッシュ要素は公開され、内部ではリンクされません。したがって、メカニズムはコピーペーストのオーバーライドであり、リンクやオーバーロードはしません。

ソースを破棄しない場合は、ファイルを開いて内容を変更してYAMLソースを変更する必要があります。新しい値を追加するには

config = Api.get(id) 
config = "#{config}\n \n #{section}: &#{section}\n <<: *#{parent_section}" 

:新しいセクションを追加するには

+0

ありがとう、私はすでにそれを行うRubyライブラリを見つけようとしましたが、見つけられませんでした。 –

0

config = Api.get(id) 
matches = /^(.+)(\n #{section}:\s*&#{section}\s*\n )(<<:[^\n]+)?(.*)$/m.match(config) 
config = "#{matches[1]}#{matches[2]}#{matches[3]}\n #{key}: #{value}#{matches[4]}\n" 
関連する問題