0

手書きのYAMLファイルのフラグメントがあります:

:alerts:
  :ctlr_alerts:
    - :param: Collector temp
      :direction: '>'
      :value: 190
    - :param: 
      :direction: 
      :value: 
    - :param: 
      :direction: 
      :value: 

これはWebサーバーに読み込まれ、データはフォームに入力するために使用されます。ユーザーがフォームの値を変更すると、新しいデータがYAMLファイルに書き戻されますが、最初に醜くなります。

:alerts: 
  :ctlr_alerts: 
  - :param: !str:WEBrick::HTTPUtils::FormData 
      str: Collector temp
      "@filename": 
      "@header": &id001 {}

      "@name": alerts.ctlr_alerts.0.param
      "@next_data": 
      "@raw_header": &id002 []

    :value: !str:WEBrick::HTTPUtils::FormData 
      str: "190"
      "@filename": 
      "@header": *id001

等...

同じYAMLファイルを読み取る定期的に実行される小さなユーティリティスクリプトがいくつかあります。上記のフラグメントを追加してから、ファイルを読み込もうとすると次のエラーが発生します。

/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/yaml.rb:133:in `transfer': invalid subclass (TypeError)

1つの回避策は追加することです

require 'webrick'

小さなスクリプトのそれぞれに。しかし、スクリプトがそれとは何の関係もないときに、Webサーバー全体のコードを吸い込まなければならないのはばかげているようです。これはruby1.8.6を実行する小さな組み込みシステムであり、リソースは少しタイトです。

YAMLにダンプする前に、このデータ構造を「クリーンアップ」(単純な配列にキャストバック)するにはどうすればよいですか?

4

1 に答える 1

0

私はこれを試しました:

if alert_change
  # convert from webrick form class to vanilla array
  alrts = @config[:alerts][:ctlr_alerts]
  aaa = []
  alrts.each do |a|
    aaa <<  { :param => a[:param].to_s,
      :direction => a[:direction].to_s,
      :value => a[:value].to_f}
  end
  @config[:alerts][:ctlr_alerts] = aaa
end

Predict.dump_config(@config)
@config = Predict.load_config

それはうまくいきました!

于 2012-09-04T07:56:12.193 に答える