Rails - depot application

I’m doing the depot example in the Agle Web development book. I’m
getting this error:

"undefined method `product’ for #BigDecimal:331ce70,‘0.21E1’,8(8) "

"Extracted source (around line #9):

8: for item in @items
9: product = item.product
10: -%>
11:


12: <%= item.product%>"
this is display_cart.rhtml

line_item.rb has:

"class LineItem < ActiveRecord::Base
belongs_to :product

def self.for_product(product)
item = self.new
item.quantity = 1
item.product = product
item.unit_price = product.price
end
end "

cart.rb has:

"class Cart

attr_reader :items
attr_reader :total_price

def initialize
@items = []
@total_price = 0.0
end

def add_product(product)
@items << LineItem.for_product(product)
@total_price += product.price
end
end "

It looks like product = item.product in display_cart.rhtml is pulling
out a decimal number not a content array item. But I have no great
idea why or how to find out what is being put into @items in the cart
class.

I haven’t been able to find a Google solution to this and I dont
think I have any typos (the downloaded sample files from the Agiles
site at pragmaticprogrammer produces the same error)

On Aug 30, 9:31 pm, “david.harris.uk[email protected]
wrote:

11:


item.quantity = 1
attr_reader :total_price
end "

It looks like product = item.product in display_cart.rhtml is pulling
out a decimal number not a content array item. But I have no great
idea why or how to find out what is being put into @items in the cart
class.

I haven’t been able to find a Google solution to this and I dont
think I have any typos (the downloaded sample files from the Agiles
site at pragmaticprogrammer produces the same error)

Hi David,

Here’s my guess:

“undefined method `product’ for #BigDecimal:331ce70,‘0.21E1’,8(8)
means that Ruby’s trying to call the method product on a BigDecimal.
On line 9 (where the error orginates), product is being called on the
variable item. Item is an element of the @items array. @items is being
built in the add_product method of the Cart class, by calling
for_product(product) on LineItem. And this is where I think the
problem is: the last line of the for_product(product) method assigns a
price to the item variable.

Every expression in Ruby returns a value. The value returned from
performing an assignment is what the right-hand side of the expression
evaluates to. Furthermore, the last expression in a Ruby method is the
return value of that method. So, instead of returning a LineItem from
the for_product(product) method, this code is actually returning the
value of the price variable, a BigDecimal.

In short, I believe the following code will fix your problem:

def self.for_product(product)
item = self.new
item.quantity = 1
item.product = product
item.unit_price = product.price
item
end

If you find this idiom confusing (I know I do), you may use the return
keyword (although hard-core Rubyists may frown upon it!):

def self.for_product(product)
item = self.new
item.quantity = 1
item.product = product
item.unit_price = product.price
return item
end

Cheers,
Louis.

I’m still getting "undefined method `product’ for #<BigDecimal:
331ce70,‘0.21E1’,8(8)> "

So this promising idea didnt work. I altered display_cart.rhtml thus:

"

<%
for item in @items
@dbg = item.type
@v1=item.methods
@v2= item.instance_variables
-%>

"

which gives:
"
wibble: LineItem =
instance variables: @attributes@[email protected] *
methods: before_createcreate_or_updatesave_with_validation[stuff]
"

So item is a LineItem class not a decimal and this looks like an
ActiveRecord class.

Which makes me wonder if this application ever worked: it’s not a typo
by me I think since I downloaded the source from the website and get
the same error, but I seem to be the only one having this problem. So
I don;t know. I think I’ll dump the example from the book since I seem
to be spending more time debugging it than learning Rails!

On Sep 6, 7:54 pm, “david.harris.uk[email protected]
wrote:

    @v1=item.methods

8: for item in @items

"class Cart
@items << LineItem.for_product(product)
think I have any typos (the downloaded sample files from the Agiles
built in the add_product method of the Cart class, by calling

If you find this idiom confusing (I know I do), you may use the return
Cheers,
Louis.

Hi David,

Do you print the class name, instance variables and methods for every
element of the @items array? I suspect that majority of the array
contains LineItem objects, but one of the elements is a BigDecimal.

You could try changing the code as I suggested above, deleting all of
the data from your database, and trying again.

Cheers,
Louis.

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs