Руби AWS — Амазонка

Я использую драгоценный камень Ruby-AWS для взаимодействия с Amazon. Я тестировал его в своем контроллере, и он работал нормально, но когда я переместил код в свою модель, он неправильно анализировал данные обратно с amazon.

Например, в моем контроллере

@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

конец


person Michael Waxman    schedule 24.11.2009    source источник


Ответы (2)


Модуль AWS возвращает ответы в виде объектов, которые детализируют соответствующие элементы результатов.

Я вызываю метод .to_s для этих объектов, чтобы получить текстовое представление. Как упоминал Джордан выше, вам может понадобиться также получить первый элемент массива, так что это будет @items[0].medium_image[0].url.to_s, хотя я подозреваю, что вам просто понадобится @items[0].medium_image.url.to_s.

Я не работал специально с изображениями, но мой код (который работает) делает это: item.detail_page_url.to_s

Я не совсем понимаю, почему ваш контроллер получает текстовую версию, а код модели — нет, но, вероятно, это связано с тем, как результат используется в конечном результате. Если вы отображаете результат в своем представлении, код представления неявно вызывает to_s для результата - <%= whatever %> фактически означает <%= whatever.to_s %>

person oskarpearson    schedule 24.11.2009

Я не использовал 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 первого элемента массива).

Я не знаю, почему вы получаете другое значение в своем контроллере, чем в своей модели, но вы должны внимательно присмотреться и убедиться, что вы действительно вызываете его одинаково в обоих случаях.

person Jordan Running    schedule 24.11.2009