-2

配列に変換された応答を取得する Savon SOAP セッションがあります。この応答の一部は、次のようなハッシュを含む変数パッケージに格納されます。

{
  :cancellation_policies=>nil,
  :contract_id=>"834",
  :hotel_id=>"41298",
  :package_id=>"6b0938e-bf45ed4facda",
  :package_price=>{
    :currency=>"NOK",
    :final_price=>"1400.05",
    :final_price_in_supplier_currency=>"169",
    :original_price=>"1400.05", 
    :original_price_in_supplier_currency=>"169",
    :supplier_currency=>"GBP"
  },
  :rooms=>{
    :room=>{
      :adults_count=>"2",
      :availability=>"Available",
      :description=>{
        :"@xmlns:a"=>"http://schemas.microsoft.com/2003/10/Serialization/Arrays"
      },
      :id=>"6de98b4b-256e-47de-bbd3-700602a16e8e",
      :kids_ages=>{
        :"@xmlns:a"=>"http://schemas.microsoft.com/2003/10/Serialization/Arrays"
      },
      :price=>{
        :currency=>"NOK",
        :final_price=>"1419.05",
        :final_price_in_supplier_currency=>"165",
        :original_price=>"1419.05",
        :original_price_in_supplier_currency=>"165",
        :supplier_currency=>"GBP"
      },
      :room_basis=>"Bed and Breakfast BB",
      :room_basis_original=>"Room and Breakfast (American Buffet Breakfast)", 
      :room_class=>"Standard",
      :room_class_original=>"Double Room",
      :room_type=>"Double",
      :room_type_original=>"Double Room"
    }
  },
  :supplier_id=>"21",
  :supplier_name=>"HTP"
}

package[:cancellation_policies] にアクセスしようとすると、奇妙なことが起こります。シンボルを整数に変換できません。

たとえば :cancellation_policies にアクセスするにはどうすればよいですか?

package.inspect が与えます;

{ :cancellation_policies=>nil, :contract_id=>"834", :hotel_id=>"41298", :package_id=>"4e80e642-13eb-48d6-9f1e-8b35f1c406ca", :package_price=>{:currency=>"NOK", :final_price=>"1677.06", :final_price_in_supplier_currency=>"195", :original_price=>"1677.06", :original_price_in_supplier_currency=>"195", :supplier_currency=>"GBP"}, :rooms=>{:room=>{:adults_count=>"2", :availability=>"Available", :description=>{:"@xmlns:a"=>"http://schemas.microsoft.com/2003/10/Serialization/Arrays"}, :id=>"dce10420-bbc5-471e-b388-03d6bb132e27", :kids_ages=>{:"@xmlns:a"=>"http://schemas.microsoft.com/2003/10/Serialization/Arrays"}, :price=>{:currency=>"NOK", :final_price=>"1677.06", :final_price_in_supplier_currency=>"195", :original_price=>"1677.06", :original_price_in_supplier_currency=>"195", :supplier_currency=>"GBP"}, :room_basis=>"Bed and Breakfast BB", :room_basis_original=>"Breakfast (Full Breakfast)", :room_class=>"Standard", :room_class_original=>"Standard Double - Double", :room_type=>"Double", :room_type_original=>"Standard Double - Double"}}, :supplier_id=>"21", :supplier_name=>"HTP"} 

(上記と同じ出力を伝えることができる限り?)

だから私は試しました;

<% package.each do |key, value| %>
<%= key %> is <%= value %>
<% end %>

これは、contract_id is 834 hotel_id is 41298 を適切に出力します

...など、それで何か明確になったら?

私にとってそれを解決する一時的なこと。

package_as_hash = Hash.new 
package.each do |key, value|
package_as_hash[key]  = value
end 

それが最も効率的な方法であることは非常に疑わしいですが、少なくとも機能します...

4

1 に答える 1

1

何らかの理由で、パッケージがハッシュではありません。

以下をコピーしてコンソールに貼り付ける場合:

package = {
            :level_1=>"1",
            :rooms=>{
              :level_2=>"2",
              :room=>{
                :level_3=>"3",
              }
            },
          }

任意のレベルのハッシュにアクセスできることがわかります。

package[:level_1]
=> "1" 
package[:rooms][:level_2]
=> "2" 
package[:rooms][:room][:level_3]
=> "3" 

ただし、誤って次のように変更{した場合[:

package = [
            :level_1=>"1",
            :rooms=>{
              :level_2=>"2",
              :room=>{
                :level_3=>"3",
              }
            },
          ]

Array が表示されます。これは、直面しているエラーのようです。

package[:level_1]
TypeError: can't convert Symbol into Integer

問題を解決するには、ハッシュを期待していた場合に配列がある理由を見つける必要があります。

  • パッケージが配列になるのを避けることができます。
  • または、配列をハッシュに変換できます。ただし、これを行うには、配列の構造を理解する必要があります。
于 2013-02-18T13:41:28.290 に答える