0

我正在使用 vaccum 从亚马逊产品广告 API 获取产品详细信息。req = Vacuum.new

    req.configure(key: configatron.api.amazon.productAPI.key,
              secret: configatron.api.amazon.productAPI.secret,
              tag:    'biz-val')

    regex =  Regexp.new "http://([^/]+)/([\\w-]+/)?(dp|gp/product|exec/obidos/asin)/(\\w+/)?(\\w{10})"
    productID=regex.match(@url).captures[4];
    host=regex.match(@url).captures[0];
    utype=regex.match(@url).captures[2];

    @url="http://#{host}/#{utype}/#{productID}"
        params = { 'Operation'   => 'ItemLookup',
           'ItemId' => productID,
           'ResponseGroup'=>'Large'
          }

    res = req.get(:query => params)
    hsh=Hash.from_xml(res.body)
    @details=hsh
    item=hsh[:ItemLookupResponse][:Items][:Item]#Throws an Undefined method [] for nilClass

您可以忽略正则表达式解析。我已经检查过它工作正常。从 res.body 生成的哈希是一个有效的哈希,它在呈现的 json 中显示得很好(@details),但是当我尝试在代码中访问它时会抛出一个 nilClass 的东西。我认为这可能是因为hsh[:ItemLookupResponse]返回的不是哈希值。我不确定它会返回什么。我如何访问 :Items ?

4

1 回答 1

0

如果它说您正在尝试调用[]a NilClass,那么您很可能是。在那条特定的线路上,您调用[]这三个

hsh
hsh[:ItemLookupResponse]
hsh[:ItemLookupResponse][:Items]

因此,其中一个很可能是nil。您可能想要使用调试器/repl 并在错误行之前放置一个断点并检查hsh. 我使用pry,您首先使用它require 'pry',然后将其放置binding.pry在您想要断点的位置。

于 2013-09-10T04:06:05.170 回答