alias_method in a plugin

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

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?

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

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 :slight_smile: (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

Thanks Pat! I never guessed that of method_missing. Makes sense now.