# Simple code doesnt work

**URL:** <https://www.ruby-forum.com/t/simple-code-doesnt-work/69347>\
**Category:** Ruby\
**Created:** [September 20, 2006, 1:20pm UTC](https://www.ruby-forum.com/t/simple-code-doesnt-work/69347 "2006-09-20T13:20:29Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![vincpa](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/v/e19adc/32.png) [@vincpa](https://www.ruby-forum.com/u/vincpa)\
**Post date:** [September 20, 2006, 1:20pm UTC](https://www.ruby-forum.com/t/simple-code-doesnt-work/69347/1 "2006-09-20T13:20:29Z")

</div>

Hi everyone,

Can anyone tell me why this doesnt work?

Im getting this error  
cf.rb:26: undefined method `price’ for #\<Ticket:0x27ed554  
@d=“11/12/2006”, @price=5.0, @v=“yer”\> (NoMethodError)

thanks, just learning 🙂

class Ticket

```
def initialize(venue,date)
	@v = venue
	@d = date
end

def venue
	@v
end

def date
	@d
end

def price=(amount)
	@price = amount
end

```

end

ticket = Ticket.new(“yer”,“11/12/2006”)  
puts “ticket stuff is #{ticket.venue} #{ticket.date}”

ticket.price = (5.00)

puts “ticket mooch is #{ticket.price}”

---

<div class="post-metadata">

**Author:** ![vincpa](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/v/e19adc/32.png) [@vincpa](https://www.ruby-forum.com/u/vincpa)\
**Post date:** [September 20, 2006, 1:32pm UTC](https://www.ruby-forum.com/t/simple-code-doesnt-work/69347/2 "2006-09-20T13:32:31Z")

</div>

Hello Vince 😉 !

> ```
> @price = amount
> 
> ```
> 
> end  
> end
> 
> ticket = Ticket.new(“yer”,“11/12/2006”)  
> puts “ticket stuff is #{ticket.venue} #{ticket.date}”
> 
> ticket.price = (5.00)
> 
> puts “ticket mooch is #{ticket.price}”

You define the price= method, but you don’t define the price method.  
You can’t access to instance variables from outside the instance unless  
you explicitly allow it via appropriate accessors. In your case,  
replacing the price= definition by

attr\_accessor :price

should work pretty well. You might want to use attr\_reader to only grant  
read acces to an instance variable or attr\_writer to only grant write  
access.

Enjoy !

```
Vince (yet another one...)
```

---

<div class="post-metadata">

**Author:** ![vincpa](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/v/e19adc/32.png) [@vincpa](https://www.ruby-forum.com/u/vincpa)\
**Post date:** [September 20, 2006, 1:34pm UTC](https://www.ruby-forum.com/t/simple-code-doesnt-work/69347/3 "2006-09-20T13:34:31Z")

</div>

Hey,

Vince /. wrote:

> Hi everyone,
> 
> Can anyone tell me why this doesnt work?
> 
> _snip_

Sure, where you’ve got a method “price=(amount)”, below:

> def price=(amount)  
> @price = amount  
> end

this only handles the assigning of the price variable. This means that:

> ticket.price = (5.00)

works fine, but trying to access ticket.price results in the error  
you’re seeing (hence why the error doesn’t occur on the above line, but  
on a later line). You simply need a method declaration for retrieving  
the variable value within your class, so try putting this in there:

def price  
@price  
end

This then ensures you’ve got one method (“price=”) that handles the  
assignation of values, and one method (“price”) to retrieve the current  
value.

Your following code should then work:

> puts “ticket mooch is #{ticket.price}”

Hope that helps!

Cheers,  
-= El =-

blog: [http://www.crazycool.co.uk](http://www.crazycool.co.uk)

---

<div class="post-metadata">

**Author:** ![vincpa](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/v/e19adc/32.png) [@vincpa](https://www.ruby-forum.com/u/vincpa)\
**Post date:** [September 20, 2006, 1:36pm UTC](https://www.ruby-forum.com/t/simple-code-doesnt-work/69347/4 "2006-09-20T13:36:32Z")

</div>

On 9/20/06, Vince /. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> puts “ticket stuff is #{ticket.venue} #{ticket.date}”
> 
> ticket.price = (5.00)
> 
> puts “ticket mooch is #{ticket.price}”

You need to define attribute reader:

def price  
@price  
end

BTW, you could accomplish the same by using  
attr\_reader(R)/attr\_writer(W)/attr\_accessor(RW):  
(if you’d rename @v, @d to @venue, @date respectively)

> class Ticket
> 
> ```
> def initialize(venue,date)
> @venue, @date = venue, date
> end
> 
> ```

```
       attr_reader :venue, :date # this will create venue() and 

```

date()  
attr\_accessor :price # this will create price=() and price()

---

<div class="post-metadata">

**Author:** ![vincpa](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/v/e19adc/32.png) [@vincpa](https://www.ruby-forum.com/u/vincpa)\
**Post date:** [September 20, 2006, 1:40pm UTC](https://www.ruby-forum.com/t/simple-code-doesnt-work/69347/5 "2006-09-20T13:40:33Z")

</div>

Vince /. wrote:

> def price=(amount)  
> @price = amount  
> end  
> end

Hi there,

You have a price= method defined, but not a price method. So when you  
say ticket.price there is no method for that.

Try this in your class:

def price  
@price  
end

Regards,  
Jordan
