How to keep strings in yaml from getting converted to times
13,000
Solution 1
If you enclose the value within single quotes, the YAML parser will treat the value as a string.
hours:
- '00:00:00'
- '00:30:00'
- '01:00:00'
Now when you access the value you will get a string instead of time
DefaultsConfig.hours[0] # returns "00:00:00"
Solution 2
Scalar without quotes or tag is a subject of implicit type. You can use quotes or explicit tag:
hours:
- '00:00:01'
- "00:00:02"
- !!str "00:00:03"
Author by
99miles
Updated on June 25, 2022Comments
-
99miles about 2 years
I have a yaml file which contains some times:
hours: - 00:00:00 - 00:30:00 - 01:00:00
But as soon as I read them they get converted to time (in seconds), but I want them to remain as strings for a moment so i can do the conversion. Here's how I'm reading them:
def daily_hours DefaultsConfig.hours.collect {|hour| logger.info { hour.to_s } } end
And it's outputting:
0 1800 3600
But I want the strings to remain unchanged to I can convert them to times such as:
12:00am 12:30am 1:00am
Why are they getting converted automatically, and how can I stop it?
Here's the DefaultConfig class:
class DefaultsConfig def self.load config_file = File.join(Rails.root, "config", "defaults.yml") if File.exists?(config_file) config = ERB.new(File.read(config_file)).result config = YAML.load(config)[Rails.env.to_sym] config.keys.each do |key| cattr_accessor key send("#{key}=", config[key]) end end end end DefaultsConfig.load
-
99miles over 14 yearsThanks, that works! It's weird that it converts it without the single quotes though!
-
Harish Shetty over 14 yearsEssentially you are casting the value to a string by enclosing it in a quote. Refer to this article for more details eng.genius.com/blog/2009/04/15/yaml-gotchas