hi,
i’ve been cracking my head on this one for a while and would be humbly
grateful for any pointers
i’m working through Agile Web Devopment w Rails and, in the depot
example have created the cart class for session handling, but am getting
the following error, which suggests the @items variable is not being
populated with any data from LineItem
NoMethodError (You have a nil object when you didn’t expect it!
You might have expected an instance of Array.
The error occured while evaluating nil.<<):
/app/models/cart.rb:12:in add_product' /app/controllers/store_controller.rb:10:in
add_to_cart’
i’ve triple-checked the code, and found the error in the book through
the errata, but really am stumped by this error.
any suggestions on good troubleshooting techniques . i have tried rake
- which says it can’t connect to mysql through the socket file - even
though the rest of the db access seems to work fine. i suspect this is
part of the problem, seeing as the variable is empty, but don’t know how
to pin it down .
i’ve also tried irb store_controller, which seems fine, except for:
NameError: uninitialized constant ApplicationController
from app/controllers/store_controller.rb:1
code (with my some of my own comments as follows). once again, thanks in
advance:
class Cart
attr_reader :items
attr_reader :total_price
def initialise
@items = []
@total_price = 0.0
end
def add_product(product)
@items << LineItem.for_product(product) #uses helper class method
“for_product” in model: line_item.rb, which creates a line_item based on
a given product
@total_price += product.price
end
end
class StoreController < ApplicationController
def index # calls salable_items function in the controller to create
a list of items that are available for sale depending on date
@products = Product.salable_items
end
def add_to_cart # method to add product with :id to the cart with
redirect to display
product = Product.find(params[:id])
@cart = find_cart # gets existing cart object or creates new one
@cart.add_product(product) # add product method sits in the Cart
class (in models)
redirect_to(:action => ‘display_cart’)
end
def display_cart
@cart = find_cart
@items = @cart.items
end
private # everything below here is private. any public actions need
to be above this part of the class
def find_cart # creates a new cart session object if one doesn’t
exist pg 81
@cart = session[:cart] ||= Cart.new
end
end