2009-11-24 193 views
0

我使用Ruby的AWS宝石与亚马逊进行交互。我在我的控制器中测试了它,并且它工作正常,但是当我将代码移到我的模型中时,它不能正确解析来自亚马逊的数据。红宝石AWS - 亚马逊

举例来说,在我的控制器

@items[0].medium_image.url = "http://ecx.images-amazon.com/images/I/61YIGdgh86L._SL160_.jpg" 

但在我的模型

items[0].medium_umage.url = '[#<Amazon::AWS::AWSObject::URL:0x1030ba758 value="http://ecx.images-amazon.com/images/I/61YIGdgh86L._SL160_.jpg">]' 

请帮帮忙!

在两种情况下,我的代码是:

def add_amazon_links 
require 'amazon/aws' 
require 'amazon/aws/search' 

query = self.name 
#!/usr/bin/ruby -w 
# 
# $Id: item_search1,v 1.4 2008/04/11 19:24:24 ianmacd Exp $ 

is = ItemSearch.new('All', { 'Keywords' => '#{query}' }) 
rg = ResponseGroup.new('Medium', 'Reviews') 

req = Request.new 
req.locale = 'us' 

resp = req.search(is, rg) 

items = resp.item_search_response[0].items[0].item 
@items = resp.item_search_response[0].items[0].item 

unless @items[0].blank? 
    self.image_url = @items[0].medium_image.url 
    self.a_price = @items[0].item_attributes[0].list_price[0].formatted_price 
    self.title = @items[0].item_attributes[0].title 
    self.a_url = @items[0].detail_page_url 
    self.save! 
end 

回答

1

的AWS模块为响应返回为对象,详细说明相关的结果项。

我呼吁这些对象的.to_s方法来获取文本表示。正如乔丹上面提到的,您可能需要获得该数组的第一个元素了,所以那简直@items[0].medium_image[0].url.to_s,虽然我怀疑你只需要@items[0].medium_image.url.to_s

我没有与图像具体的工作,但我的代码(工作)做到这一点:item.detail_page_url.to_s

我不完全知道为什么你的控制器获取文本版本,型号代码ISN” t,但这可能与结果在最终结果中的使用方式有关。如果你显示的结果在您的视图,该视图代码被隐式调用的结果to_s - <%= whatever %>实际上意味着<%= whatever.to_s %>

0

我没有使用AWS,但看起来在第二情况下,它返回一个数组具有一个元件,Amazon::AWS::AWSObject::URL对象。也就是说,以下字符串:

[#<Amazon::AWS::AWSObject::URL:0x1030ba758 value="http://ecx.images-amazon.com/images/I/61YIGdgh86L._SL160_.jpg">] 

...正是我期望得到,如果items[0].medium_image.url是在它的AWSObject::URL对象数组,我想整个事情转换为字符串。为了得到实际的URL字符串,我将调用items[0].medium_image.url[0].value(数组第一个元素的value属性)。

我不知道为什么你在你的控制器得到一个不同的值,当时在模型中,但你应该仔细观察,并确保你实际上调用它在这两种情况下相同的方式。