如何保持yaml中的字符串不被转换为时间

99m*_*les 3 ruby yaml ruby-on-rails

我有一个yaml文件,其中包含一些时间:

  hours:
    - 00:00:00
    - 00:30:00
    - 01:00:00
Run Code Online (Sandbox Code Playgroud)

但是一旦我读到它们就会转换为时间(以秒为单位),但我希望它们能够作为字符串保留片刻,以便我可以进行转换.这是我正在阅读它们的方式:

  def daily_hours
    DefaultsConfig.hours.collect {|hour|
      logger.info { hour.to_s }
    }
  end
Run Code Online (Sandbox Code Playgroud)

它输出:

0 1800 3600

但我希望字符串保持不变,我可以将它们转换为以下时间:

凌晨12:00至凌晨1:30凌晨1:00

为什么他们会自动转换,我怎么能阻止它?

这是DefaultConfig类:

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
Run Code Online (Sandbox Code Playgroud)

Har*_*tty 8

如果将值括在单引号内,则YAML解析器会将该值视为字符串.

hours:
    - '00:00:00'
    - '00:30:00'
    - '01:00:00'
Run Code Online (Sandbox Code Playgroud)

现在,当您访问该值时,您将获得一个字符串而不是时间

DefaultsConfig.hours[0] # returns "00:00:00"
Run Code Online (Sandbox Code Playgroud)


And*_*rey 7

没有引号或标记的标量是隐式类型的主题。您可以使用引号或显式标记:

hours:
       - '00:00:01'
       - "00:00:02"
       - !!str "00:00:03"
Run Code Online (Sandbox Code Playgroud)