/ / Ruby YAML :: load - ruby-on-rails, rubín, yaml

Ruby YAML :: zaťaženie - rubínové na koľajniciach, rubín, yamel

Snažím sa zmeniť predvolenú deserializáciu vstavaného formátu časovej značky, aby som ovplyvnil Rubyho čas.

Robím to (úspešne) s Hash:

YAML::add_domain_type("yaml.org,2002", "map") { |t, v| nil }
YAML::add_domain_type("ruby.yaml.org,2002", "hash") { |t, v| nil }
hash = { :hello => :world }
puts YAML::load(hash.to_yaml) # nil

Ale keď to isté skúšam s Časom, nefunguje to:

YAML::add_domain_type("yaml.org,2002", "timestamp") { |t, v| nil }
YAML::add_domain_type("ruby.yaml.org,2002", "time") { |t, v| nil }
puts YAML::load(Time.now.to_yaml).class # "Time"

Akákoľvek pomoc by bola ocenená. Vďaka!

odpovede:

2 pre odpoveď č. 1

Ak používate Psych (čo je YAML v ruby ​​1.9.3p194), potom musíte definovať encode_with/1 metóda na časovej triede.

require "yaml"

class Time
def encode_with(coder)
coder.tag = "!ruby/time"
coder.scalar = to_s
end
end

YAML::add_domain_type("ruby.yaml.org,2002", "ruby/time") { |t, v| "HELLO!!" }

yaml = YAML.dump(Time.new)  # -> "--- !ruby/time 2012-10-25 14:18:59 -0400n...n"
YAML.load(yaml)  # -> "HELLO!!"

Ak encode_with/1 metóda je definovaná na objekte, potom Psych volá túto metódu, ktorá prechádza v inštancii Psych::Coder trieda; inak to nazýva visit_#{o.class} metóda v YAMLTree triedy, ktorá v prípade visit_Time nesignalizuje žiadne informácie o značkách.

https://github.com/tenderlove/psych/blob/master/lib/psych/visitors/yaml_tree.rb#l100-105

https://github.com/tenderlove/psych/blob/master/lib/psych/visitors/yaml_tree.rb#l172-175