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

ETC...

我有一些定期运行的小型实用程序脚本,它们也读取相同的 YAML 文件。由于添加了上面的片段,他们在尝试读取文件时收到以下错误:

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

一种解决方法是添加

require 'webrick'

到每个小脚本。但是,当脚本与此无关时,不得不吸收整个 Web 服务器的代码似乎很可笑。这是一个运行ruby 1.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 回答