Ruby Ruby Collections Build a Grocery List Program Build a Grocery List Program: Part 3

Asa Smith
Asa Smith
10,009 Points

Undefined method 'push' I keep getting this error. Any idea why?

def create_list
  print "What is the list name? "
  name= gets.chomp

  hash = { "name" => name, "items:" => Array.new }
  return hash
end

def add_list_item
  print "What is the item called? "
  item_name = gets.chomp

  print "How much?"
  quantity = gets.chomp.to_i

  hash = { "name" => item_name, "quantity" => quantity }
 end

def print_list(list)
  puts "List: #{list['name']}"
  puts "____"

  list["items"].each do |item|
    puts "Item: " + item['name']
    puts "Quantity: " + ['quantity'].to_s
    puts "___"
  end
end

list = create_list()
puts list.inspect
list['items'].push(add_list_item())


puts list.inspect

print_list(list)

3 Answers

Grace Kelly
Grace Kelly
33,980 Points

Hi Asa, I think the issue is on these lines:

 hash = { "name" => name, "items:" => Array.new }
list["items"].push(add_list_item())

If you rename "items:" to "items" when you declare the hash, your code should execute, and it will also correspond with how you named "name" :)

Asa Smith
Asa Smith
10,009 Points

That was it. Thanks!

Jeff Delacruz
Jeff Delacruz
2,043 Points

Here's what I got to work.

def create_list
  print "What is the list name? "
  name = gets.chomp

  hash = { "name": name, "items":Array.new } #since name & the array are not strings, you must reference them as symbols with the : later in the code.  I think that's the issue here.  
  return hash
end

def add_list_item
  print "What is the item called? "
  item_name = gets.chomp

  print "How Much? "
  quantity = gets.chomp.to_i

  hash = {"name": item_name, "quantity": quantity }
  return hash
end

def print_list(list)
  puts "List: #{list[:name]}" #Change 'name' to :name
  puts "----"

 list[:items].each do |item|
    puts "Item: " + item[:name] #Change 'name' to :name
    puts "Quantity: " + item[:quantity].to_s #Change 'quantity' to :quantity
    puts "---"
end
end

#run the code
list = create_list()
puts list.inspect
list[:items].push(add_list_item()) #Change "items" to :items
print_list(list)