我处于需要找出散列级别并为该级别中的所有元素应用名称空间的情况。
这是场景:
我有一个用我的数据填充的对象。
接下来我将对象转换为哈希。
#convert Object to Hash def my_hash Hash[instance_variables.map { |var| [var[1..-1].to_sym, instance_variable_get(var)] }] end
最后,我想遍历哈希并将不同的命名空间应用于我的嵌套哈希。
不幸的是,我无法直接使用 savon gem 找到一个好的解决方案:
soap.body = request_object.my_hash
我将检查每个元素并尝试以递归方式在分类方法中找到嵌套级别:(这需要更多魔法)
def classify(o) case o when Hash #Need to refactor this to prefix :data NS for nested hash, overwriting the default :mes NS. h = {} o.each {|k,v| h[k] = classify(v)} h else o.class end end soap.body = classify(request_object.my_hash)
它应该看起来像这样,源哈希:
{:UserTicket=>'123',:ImpersonationUsername=>'dave',:TicketSettings=>{:ResourceId=>'abcd',:ClientIp=>'0',:Username=>'bobby'}}
输出(其中 mes 和 data 是两个命名空间):
{'mes:UserTicket'=>'123','mes:ImpersonationUsername'=>'dave','mes:TicketSettings'=>{'data:ResourceId'=>'abcd','data:ClientIp'=>'0','data:Username'=>'bobby'}}