我正在尝试构建一个API包装器gem,并且在将API返回的JSON转换为更多Rubyish格式时遇到问题.
JSON包含多层嵌套,包括哈希和数组.我想要做的是递归地将所有键转换为snake_case以便于使用.
这是我到目前为止所得到的:
def convert_hash_keys(value)
return value if (not value.is_a?(Array) and not value.is_a?(Hash))
result = value.inject({}) do |new, (key, value)|
new[to_snake_case(key.to_s).to_sym] = convert_hash_keys(value)
new
end
result
end
Run Code Online (Sandbox Code Playgroud)
上面调用此方法将字符串转换为snake_case:
def to_snake_case(string)
string.gsub(/::/, '/').
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
gsub(/([a-z\d])([A-Z])/,'\1_\2').
tr("-", "_").
downcase
end
Run Code Online (Sandbox Code Playgroud)
理想情况下,结果类似于以下内容:
hash = {:HashKey => {:NestedHashKey => [{:Key => "value"}]}}
convert_hash_keys(hash)
# => {:hash_key => {:nested_hash_key => [{:key => "value"}]}}
Run Code Online (Sandbox Code Playgroud)
我得到的递归是错误的,我试过的这种解决方案的每个版本都不会将符号转换为超出第一级别,或者过度使用并尝试转换整个哈希值,包括值.
尝试在辅助类中解决所有这些问题,而不是修改实际的Hash和String函数(如果可能).
先感谢您.
我正在编写一个API包装器作为gem,我想使用RSpec测试API响应.
这个问题是所有的API请求都是使用GET生成的,并且在url中包含一个API密钥:
例如 game/metadata/{api_key}
这给测试带来了问题,因为我不想将API密钥保存在git存储库历史记录中.有什么方法可以进行这些规范测试,最好使用RSpec/VCR,而不是将API密钥存储在版本控制中?
我尝试过使用环境变量,但VCR仍然存储整个请求,而不仅仅是响应体.