# Alias\_method in a plugin

**URL:** <https://www.ruby-forum.com/t/alias-method-in-a-plugin/104824>\
**Category:** Rails\
**Created:** [May 22, 2007, 11:06pm UTC](https://www.ruby-forum.com/t/alias-method-in-a-plugin/104824 "2007-05-22T23:06:34Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![leonb](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/22d042/32.png) [@leonb](https://www.ruby-forum.com/u/leonb)\
**Post date:** [May 22, 2007, 11:06pm UTC](https://www.ruby-forum.com/t/alias-method-in-a-plugin/104824/1 "2007-05-22T23:06:34Z")

</div>

Hi all,

I’m trying to override some method of a class. I’ve created an  
acts\_as\_money method. The first parameter is the method name that  
should be overridden. For example:

I have a model with an attribute “amount”. I want to be able to do  
this:  
acts\_as\_money :amount

Then the amount method should be aliased to an already defined method  
in the plugin.  
I’ve got this code now:  
[http://pastie.caboo.se/63676](http://pastie.caboo.se/63676)

But then I get this error: NameError: undefined method `amount' for class `Declaration’

And the Declaration model HAS a method amount. Does anyone now how I  
can solve this problem?

---

<div class="post-metadata">

**Author:** ![leonb](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/22d042/32.png) [@leonb](https://www.ruby-forum.com/u/leonb)\
**Post date:** [May 23, 2007, 2:49am UTC](https://www.ruby-forum.com/t/alias-method-in-a-plugin/104824/2 "2007-05-23T02:49:10Z")

</div>

double check the error and make sure its talking about an instance  
method and not a Class method which should not exist

---

<div class="post-metadata">

**Author:** ![leonb](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/22d042/32.png) [@leonb](https://www.ruby-forum.com/u/leonb)\
**Post date:** [May 23, 2007, 8:29pm UTC](https://www.ruby-forum.com/t/alias-method-in-a-plugin/104824/3 "2007-05-23T20:29:55Z")

</div>

This is the precise error:

> > dec = Declaration.new  
> > NameError: undefined method `amount' for class `Declaration’  
> > from ./script/…/config/…/config/…/vendor/plugins/  
> > acts\_as\_money/lib/acts\_as\_money.rb:12:in `instance_method' from ./script/../config/../config/../vendor/plugins/ acts_as_money/lib/acts_as_money.rb:12:in `acts\_as\_money’  
> > from ./script/…/config/…/config/…/app/models/declaration.rb:  
> > 19  
> > from /usr/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/  
> > active\_support/dependencies.rb:203:in  
> > `load_without_new_constant_marking' from /usr/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/ active_support/dependencies.rb:203:in `load\_file’  
> > from /usr/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/  
> > active\_support/dependencies.rb:342:in `new_constants_in' from /usr/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/ active_support/dependencies.rb:202:in `load\_file’  
> > from /usr/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/  
> > active\_support/dependencies.rb:94:in `require_or_load' from /usr/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/ active_support/dependencies.rb:248:in `load\_missing\_constant’  
> > from /usr/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/  
> > active\_support/dependencies.rb:452:in `const_missing' from /usr/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/ active_support/dependencies.rb:464:in `const\_missing’  
> > from (irb):1

On May 23, 2:49 am, Keynan P. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

---

<div class="post-metadata">

**Author:** ![leonb](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/22d042/32.png) [@leonb](https://www.ruby-forum.com/u/leonb)\
**Post date:** [May 23, 2007, 9:47pm UTC](https://www.ruby-forum.com/t/alias-method-in-a-plugin/104824/4 "2007-05-23T21:47:06Z")

</div>

On 5/22/07, LeonB [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> >

Actually, there is no amount method in the Declaration class. Rails  
uses method\_missing to read the attributes.

If you want to do this, just define the method. In order to read the  
amount column’s value, use read\_attribute.

define\_method(:amount) { “$#{read\_attribute(:amount)}” }

Let’s say you need to provide the raw column value for some reason.  
read\_attribute is private so you can’t use it, plus it breaks  
encapsulation, plus it’s just ugly 🙂 (d.send :read\_attribute,  
:amount. bleh)

Go ahead and define an accessor method that does read\_attribute for you:

```
    def acts_as_money(name, options = {})
      define_method(:old_amount) { read_attribute :amount }
      define_method(:amount) { "$#{old_amount}" }
    end

```

hth

Pat

---

<div class="post-metadata">

**Author:** ![leonb](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/22d042/32.png) [@leonb](https://www.ruby-forum.com/u/leonb)\
**Post date:** [May 23, 2007, 3:18am UTC](https://www.ruby-forum.com/t/alias-method-in-a-plugin/104824/5 "2007-05-23T03:18:03Z")

</div>

maybe this would be simpler

```
   def acts_as_money(name, options = {})
      define_method(:"#{name}", "def amount @amount end")

      include LeonB::Acts::Money::InstanceMethods
      extend LeonB::Acts::Money::SingletonMethods
    end
```

---

<div class="post-metadata">

**Author:** ![leonb](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/22d042/32.png) [@leonb](https://www.ruby-forum.com/u/leonb)\
**Post date:** [May 23, 2007, 10:06pm UTC](https://www.ruby-forum.com/t/alias-method-in-a-plugin/104824/6 "2007-05-23T22:06:08Z")

</div>

Thanks Pat! I never guessed that of method\_missing.  
Makes sense now.

---

<div class="post-metadata">

**Author:** ![leonb](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/22d042/32.png) [@leonb](https://www.ruby-forum.com/u/leonb)\
**Post date:** [May 23, 2007, 10:06pm UTC](https://www.ruby-forum.com/t/alias-method-in-a-plugin/104824/7 "2007-05-23T22:06:12Z")

</div>

Thanks Pat! I never guessed that of method\_missing.  
Makes sense now.

---

<div class="post-metadata">

**Author:** ![leonb](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/22d042/32.png) [@leonb](https://www.ruby-forum.com/u/leonb)\
**Post date:** [May 23, 2007, 10:07pm UTC](https://www.ruby-forum.com/t/alias-method-in-a-plugin/104824/8 "2007-05-23T22:07:14Z")

</div>

Thanks Pat! I never guessed that of method\_missing.  
Makes sense now.
