1
ハッシュのレベルを調べ、そのレベルのすべての要素に名前空間を適用する必要がある状況です。Ruby:名前空間をハッシュに接頭する方法
これはシナリオです:
私は私のデータが移入されたオブジェクトを持っています。
次の例では、オブジェクトをハッシュに変換します。
#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
:
- は、残念ながら、私は直接サボン宝石でこれを行うには良い解決策を見つけることができませんでした:
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、データは2つのネームスペースである):
{'mes:UserTicket'=>'123','mes:ImpersonationUsername'=>'dave','mes:TicketSettings'=>{'data:ResourceId'=>'abcd','data:ClientIp'=>'0','data:Username'=>'bobby'}}
「String」の代わりに、実際の値が表示されないのはなぜですか? – Dejan
これは 'case'ステートメントの' else'に 'o.class'がある元のものです。 'class'を削除して' o'で終わることができます。 – tadman