Arguments Error

Your error message is:

wrong number of arguments (1 for 0)

That means that somewhere, you are calling a method that doesn’t expect any arguments and you are passing an argument to it. The stack trace give you a clue:

ArgumentError in StoreController#add_to_cart

app/models/cart.rb:13:in initialize' app/models/cart.rb:13:in new’ app/models/cart.rb:13:in add_product' app/controllers/store_controller.rb:10:in add_to_cart’

One of the methods listed (#add_to_cart, #initialize, #new, or #add_product) is being called with an argument where it wasn’t expecting one.

StoreController#add_to_cart – doesn’t expect any methods, but this is called by the Rails framework as an action, and Rails doesn’t pass any arguments to the action methods Cart#add_product – expects 1 argument, you’re calling it with 1 argument in StoreController#add_to_cart

CartItem#new – calls CartItem#initialize with however many arguments it was passed – is called with 1 argument in Cart#add_product CartItem#initialze – expects 0 arguments, you passed 1 argument in via CartItem#new

–wpd

StoreController#add_to_cart -- doesn't expect any methods, but this is called by the Rails framework as an action, and Rails doesn't pass any arguments to the action methods

Cart#add_product -- expects 1 argument, you're calling it with 1 argument in StoreController#add_to_cart

CartItem#new -- calls CartItem#initialize with however many arguments it was passed -- is called with 1 argument in Cart#add_product

CartItem#initialze -- expects 0 arguments, you passed 1 argument in via CartItem#new

I'm not really sure what do do with that -- what should I change? Are you saying only my CartItem#initialze is wrong?

CartItem#initialze

– expects 0 arguments, you passed 1 argument in via CartItem#new

I’m not really sure what do do with that – what should I change? Are

you saying only my CartItem#initialze is wrong?

Probably.

You could always add a parameter to your CartItem#initialize method. I’m not sure that you’re heading in the direction you want to be heading, since it appears that CartItem is not derived from ActiveRecord::Base – it’s not tied to a database.

You might want to go back and study Rail’s ideas regarding models, how they tie to database tables, and how you can initialize them.

–wpd

Probably.

You could always add a parameter to your CartItem#initialize method. I'm not sure that you're heading in the direction you want to be heading, since it appears that CartItem is not derived from ActiveRecord::Base -- it's not tied to a database.

You might want to go back and study Rail's ideas regarding models, how they tie to database tables, and how you can initialize them.

I following along from the book DHH wrote verbatim, but it's the second edition. It was my understanding that having a database table for the cart was unnecessary because it's session data and would be avaliable based on that user?

Looks like you have two open posts for the same issue... Here is the answer from the other post...

ahhhh Sorry I see now I was thinking that the CartItem class was an activerecord class ... The issue is this: Here you call a new object of CartItem with a product passed @items << CartItem.new(product) But here in the initialize you do not have a argument for initialize... class CartItem   attr_reader :product, :quantity   def initialize     @product = product     @quantity = 1   end Change it to this class CartItem   attr_reader :product, :quantity   def initialize( product )     @product = product     @quantity = 1   end

I would NEVER store the cartitem(add product to cart) in a session object for a ecommerce application. Yes there are things that could/ should be stored in the session but not something like adding a product to your cart... Unless you have a session replication system for your back-end which then would store the session in either the database or memcache anywho...

ahhhh Sorry I see now I was thinking that the CartItem class was an activerecord class ... The issue is this: Here you call a new object of CartItem with a product passed @items << CartItem.new(product) But here in the initialize you do not have a argument for initialize... class CartItem   attr_reader :product, :quantity   def initialize     @product = product     @quantity = 1   end Change it to this class CartItem   attr_reader :product, :quantity   def initialize( product )     @product = product     @quantity = 1   end

Interesting, tried that and it's spitting a "no method for cart_item back at me:

NameError in Store#add_to_cart

Showing app/views/store/add_to_cart.rhtml where line #4 raised:

undefined local variable or method `cart_item' for #<#<Class:0x2602924>:0x26028e8>

Extracted source (around line #4):

1: <h1>The shopping cart</h1> 2: <ul> 3: <% for item in @cart.items %> 4: <li><%= cart_item.quantity %> &times; <%= h(item.title) %></li> 5: <% end %> 6: </ul>

RAILS_ROOT: script/../config/.. Application Trace | Framework Trace | Full Trace

#{RAILS_ROOT}/app/views/store/add_to_cart.rhtml:4:in `_run_rhtml_47app47views47store47add_to_cart46rhtml' #{RAILS_ROOT}/app/views/store/add_to_cart.rhtml:3:in `each' #{RAILS_ROOT}/app/views/store/add_to_cart.rhtml:3:in `_run_rhtml_47app47views47store47add_to_cart46rhtml'

Any idea?

Where does the cart_item come from? is that in the Store controller? post the store controller... The view has the @cart object but also needs the cart_item.. Is that from the session?

I have the exact same problem. same book. same code. same error.

So, how did you finally solve the problem ?

Thanks Angel