如何将Ruby on Rails中嵌套哈希的所有值转换为字符串?

更新于
2026-10-09 18:43:53
1阅读来源:SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计385个文字,预计阅读时间需要2分钟。

如何将Ruby on Rails中嵌套哈希的所有值转换为字符串?

以下是对您提供的代码的简化版本:

rubydef stringify_values(obj) values=obj.clone values.each do |k, v| values[k]=v.is_a?(Hash) ? stringify_values(v) : v.to_s end return valuesend

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

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

所以给出以下哈希:

如何将Ruby on Rails中嵌套哈希的所有值转换为字符串?

{ 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], text: 'foobar', obj: { me: Foo.new} } } puts YAML.dump (stringify_values h) #=> --- :post: :id: '123' :arr: "[1, 2, 3]" :text: foobar :obj: :me: I am Foo

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

本文共计385个文字,预计阅读时间需要2分钟。

如何将Ruby on Rails中嵌套哈希的所有值转换为字符串?

以下是对您提供的代码的简化版本:

rubydef stringify_values(obj) values=obj.clone values.each do |k, v| values[k]=v.is_a?(Hash) ? stringify_values(v) : v.to_s end return valuesend

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

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

所以给出以下哈希:

如何将Ruby on Rails中嵌套哈希的所有值转换为字符串?

{ 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], text: 'foobar', obj: { me: Foo.new} } } puts YAML.dump (stringify_values h) #=> --- :post: :id: '123' :arr: "[1, 2, 3]" :text: foobar :obj: :me: I am Foo

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