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 @valuesend
所以给出以下哈希:
{ 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}endclass Foo def to_s "I am Foo" endendh = { 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也会将数组作为字符串给出,无论是否合适,您可以稍微决定并调整解决方案.
总结以上是内存溢出为你收集整理的ruby-on-rails – 处理嵌套哈希以将所有值转换为字符串全部内容,希望文章能够帮你解决ruby-on-rails – 处理嵌套哈希以将所有值转换为字符串所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)