Using a method while looping through an array in ruby
I am using ruby-aaws to return Amazon Products and I want to enter them into my DB. I have created a model Amazonproduct and I have created a method get_amazon_data to return an array with all the product information. When i define the specific element in the array ( e.g. to_a[0] ) and then use ruby-aaws item_attributes method, it returns the name I am searching for and saves it to my DB. I am trying to iterate through the array and still have the item_attributes method work. When i don't define the element, i get this error: undefined method `item_attributes' for #Array:0x7f012cae2d68
Here is the code in my controller.
def create
@arr = Amazonprod开发者_C百科uct.get_amazon_data( :r ).to_a
@arr.each { |name|
@amazonproduct = Amazonproduct.new(params[:amazonproducts])
@amazonproduct.name = @arr.item_attributes.title.to_s
}
EDIT: Code in my model to see if that helps:
class Amazonproduct < ActiveRecord::Base
def self.get_amazon_data(r)
resp = Amazon::AWS.item_search('GourmetFood', { 'Keywords' => 'Coffee Maker' })
items = resp.item_search_response.items.item
end
end
Thanks for any help/advice.
I'm not familiar with the Amazon API, but I do observe that @arr
is an array. Arrays do not usually have methods like item_attributes
, so you probably lost track of which object was which somewhere in the coding process. It happens ;)
Try moving that .item_attributes
call onto the object that supports that method. Maybe amazonproduct.get_amazon_data(:r)
, before its being turned into an array with to_a
, has that method?
It's not quite clear to me what your classes are doing but to use #each, you can do something like
hash = {}
[['name', 'Macbook'], ['price', 1000]].each do |sub_array|
hash[sub_array[0]] = sub_array[1]
end
which gives you a hash like
{ 'name' => 'Macbook', 'price' => 1000 }
This hash may be easier to work with
@product = Product.new
@product.name = hash[:name]
....
EDIT
Try
def create
@arr = Amazonproduct.get_amazon_data( :r ).to_a
@arr.each do |aws_object|
@amazonproduct = Amazonproduct.new(params[:amazonproducts])
@amazonproduct.name = aws_object.item_attributes.title.to_s
end
end
精彩评论