ruby-on-rails – 处理嵌套哈希以将所有值转换为字符串

我有以下代码,它采用哈希并将所有值转换为字符串.

def stringify_values obj
  @values ||= obj.clone

  obj.each do |k,v|
    if v.is_a?(Hash)
      @values[k] = stringify_values(v)
    else
      @values[k] = v.to_s
    end
  end

  return @values
end

所以给出以下哈希:

{
  post: {
    id: 123,text: 'foobar',}
}

我得到了YAML输出

--- &1
:post: *1
:id: '123'
:text: 'foobar'

当我想要这个输出

--- 
:post: 
  :id: '123'
  :text: 'foobar'

看起来该对象已被展平,然后被赋予对自身的引用,这导致我的规范中的堆栈级错误.

如何获得所需的输出?

解决方法

stringify_values的一个更简单的实现可以是 – 假设它总是一个哈希.此函数使用由Active Support Core Extensions添加的 Hash#deep_merge方法 – 我们将哈希与自身合并,以便在块中我们检查每个值并在其上调用to_s.

def stringify_values obj
  obj.deep_merge(obj) {|_,_,v| v.to_s}
end

完整的工作样本:

require "yaml"
require "active_support/core_ext/hash"

def stringify_values obj
  obj.deep_merge(obj) {|_,v| v.to_s}
end

class Foo
    def to_s
        "I am Foo"
    end
end

h = {
  post: {
    id: 123,arr: [1,2,3],obj: { me: Foo.new}
  }
}

puts YAML.dump (stringify_values h)
#=> 
---
:post:
  :id: '123'
  :arr: "[1,3]"
  :text: foobar
  :obj:
    :me: I am Foo

不确定value是数组时的期望是什么,因为Array#to_s也会将数组作为字符串给出,无论是否合适,您可以稍微决定并调整解决方案.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...