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"
Share:
13,000
99miles
Author by

99miles

Updated on June 25, 2022

Comments

  • 99miles
    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
    99miles over 14 years
    Thanks, that works! It's weird that it converts it without the single quotes though!
  • Harish Shetty
    Harish Shetty over 14 years
    Essentially 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