ハッシュのレベルを調べて、そのレベルのすべての要素に名前空間を適用する必要がある状況にあります。
これがシナリオです:
データが入力されているオブジェクトがあります。
次に、オブジェクトをハッシュに変換します。
#convert Object to Hash def my_hash Hash[instance_variables.map { |var| [var[1..-1].to_sym, instance_variable_get(var)] }] end
最後に、ハッシュをループして、ネストされたハッシュに別の名前空間を適用したいと思います。
残念ながら、私はサボンジェムでこれを直接行うための良い解決策を見つけることができませんでした:
soap.body = request_object.my_hash
各要素を調べて、classifyメソッドでネストされたレベルを再帰的に見つけようとします:(これにはもう少し魔法が必要です)
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は2つの名前空間です):
{'mes:UserTicket'=>'123','mes:ImpersonationUsername'=>'dave','mes:TicketSettings'=>{'data:ResourceId'=>'abcd','data:ClientIp'=>'0','data:Username'=>'bobby'}}