# How to call a class method from an instance

**URL:** <https://www.ruby-forum.com/t/how-to-call-a-class-method-from-an-instance/84547>\
**Category:** Rails\
**Created:** [February 5, 2007, 10:20pm UTC](https://www.ruby-forum.com/t/how-to-call-a-class-method-from-an-instance/84547 "2007-02-05T22:20:19Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![BSLars](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/e5b9ba/32.png) [@BSLars](https://www.ruby-forum.com/u/BSLars)\
**Post date:** [February 5, 2007, 10:20pm UTC](https://www.ruby-forum.com/t/how-to-call-a-class-method-from-an-instance/84547/1 "2007-02-05T22:20:19Z")

</div>

I am trying to call a class method from an instance,

e.g. @item = @item.class.find(params[:id]) or  
@item = @item.type.find(params[:id])

@Item can reference objects form different classes.

With either of the above examples I get:  
undefined method `find’ for NilClass:Class

Any help?

---

<div class="post-metadata">

**Author:** ![BSLars](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/e5b9ba/32.png) [@BSLars](https://www.ruby-forum.com/u/BSLars)\
**Post date:** [February 5, 2007, 10:27pm UTC](https://www.ruby-forum.com/t/how-to-call-a-class-method-from-an-instance/84547/2 "2007-02-05T22:27:19Z")

</div>

I don’t know that it is the best way, but you can do this with eval.  
Eval will take a string and interpret it as ruby code.

So you would do something like:

eval( @item.class + ‘.find(params[:id])’ )

So this should take your class name, append the find clause and then  
run the result.

---

<div class="post-metadata">

**Author:** ![BSLars](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/e5b9ba/32.png) [@BSLars](https://www.ruby-forum.com/u/BSLars)\
**Post date:** [February 5, 2007, 10:38pm UTC](https://www.ruby-forum.com/t/how-to-call-a-class-method-from-an-instance/84547/3 "2007-02-05T22:38:22Z")

</div>

Ok I tried eval( @item.class.to\_s + ‘.find(params[:id])’ )  
and i still get the error  
undefined method `find’ for NilClass:Class error.

---

<div class="post-metadata">

**Author:** ![BSLars](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/e5b9ba/32.png) [@BSLars](https://www.ruby-forum.com/u/BSLars)\
**Post date:** [February 5, 2007, 10:40pm UTC](https://www.ruby-forum.com/t/how-to-call-a-class-method-from-an-instance/84547/4 "2007-02-05T22:40:22Z")

</div>

stupid mistake by me I think I know the problem, i’ll post again when  
i’m sure.

---

<div class="post-metadata">

**Author:** ![BSLars](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/e5b9ba/32.png) [@BSLars](https://www.ruby-forum.com/u/BSLars)\
**Post date:** [February 5, 2007, 11:03pm UTC](https://www.ruby-forum.com/t/how-to-call-a-class-method-from-an-instance/84547/5 "2007-02-05T23:03:26Z")

</div>

Good to know, I guess I overlooked the simple answer.

Your way is better, as eval will blindly do whatever you tell it  
(which can be dangerous).

---

<div class="post-metadata">

**Author:** ![BSLars](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/e5b9ba/32.png) [@BSLars](https://www.ruby-forum.com/u/BSLars)\
**Post date:** [February 5, 2007, 10:56pm UTC](https://www.ruby-forum.com/t/how-to-call-a-class-method-from-an-instance/84547/6 "2007-02-05T22:56:24Z")

</div>

I got it working with,  
@item = @items.pop.type.find(params[:id])

I just wasn’t initializing@item with anything.

Thanks monki for the eval hint though. I wasn’t aware of the eval  
usage.

---

<div class="post-metadata">

**Author:** ![BSLars](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/e5b9ba/32.png) [@BSLars](https://www.ruby-forum.com/u/BSLars)\
**Post date:** [February 6, 2007, 10:07am UTC](https://www.ruby-forum.com/t/how-to-call-a-class-method-from-an-instance/84547/7 "2007-02-06T10:07:25Z")

</div>

Your original method was better (IMHO) – @item.class.find(params[:id])  
– as type is deprecated and can sometimes behave unexpectedly as it’s  
used as the key in STI models.

Also wanted to check you knew that @items.pop is a destructive method,  
i.e. the item is removed from @items.  
I would wonder if @items.last.class.find(params[:id]) is perhaps a bit  
cleaner.

You’ve prob figured now that undefined method `find’ for NilClass:Class  
was happening because @item was nil (instance variables are nil when  
they are undefined, unlike local variables – try p @item and p item in  
the console), and the class of nil is NilClass, which obviously doesn’t  
have a find method.

HTH  
Chris
