# Alias\_method\_chain fails

**URL:** <https://www.ruby-forum.com/t/alias-method-chain-fails/145284>\
**Category:** Rails\
**Created:** [August 7, 2008, 2:21pm UTC](https://www.ruby-forum.com/t/alias-method-chain-fails/145284 "2008-08-07T14:21:10Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![linojon](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/b3f665/32.png) [@linojon](https://www.ruby-forum.com/u/linojon)\
**Post date:** [August 7, 2008, 2:21pm UTC](https://www.ruby-forum.com/t/alias-method-chain-fails/145284/1 "2008-08-07T14:21:10Z")

</div>

I’m getting this weird undefined method error with  
alias\_method\_chain. Same if I change find to save or whatever. It  
fixes if I move the alias\_method\_chain out of the module (see bottom  
of this email). What could be causing this?

## models/foo.rb

class Foo \< ActiveRecord::Base  
include FooBar  
end

## lib/foo\_bar.rb

module FooBar  
module ClassMethods  
def find\_with\_bar( \*args )  
find\_without\_bar( \*args )  
end  
end

def self.included(base)  
base.class\_eval do  
extend ClassMethods  
alias\_method\_chain :find, :bar  
end  
end

end

## error

$ script/console  
Loading development environment (Rails 2.0.2)

> > f = Foo.new  
> > NameError: undefined method `find' for class`Foo’  
> > from /Users/jonathan/rails/test/vendor/rails/activerecord/  
> > lib/…/…/activesupport/lib/active\_support/core\_ext/module/  
> > aliasing.rb:31:in `alias_method' from /Users/jonathan/rails/test/vendor/rails/activerecord/ lib/../../activesupport/lib/active_support/core_ext/module/ aliasing.rb:31:in`alias\_method\_chain’  
> > from /Users/jonathan/rails/test/lib/foo\_bar.rb:11:in `included' from /Users/jonathan/rails/test/lib/foo_bar.rb:9:in`class\_eval’  
> > from /Users/jonathan/rails/test/lib/foo\_bar.rb:9:in `included' from /Users/jonathan/rails/test/app/models/foo.rb:2:in`include’  
> > from /Users/jonathan/rails/test/app/models/foo.rb:2  
> > from /Users/jonathan/rails/test/vendor/rails/activerecord/  
> > lib/…/…/activesupport/lib/active\_support/dependencies.rb:203:in  
> > `load_without_new_constant_marking' from /Users/jonathan/rails/test/vendor/rails/activerecord/ lib/../../activesupport/lib/active_support/dependencies.rb:203:in`load\_file’  
> > from /Users/jonathan/rails/test/vendor/rails/activerecord/  
> > lib/…/…/activesupport/lib/active\_support/dependencies.rb:342:in  
> > `new_constants_in' from /Users/jonathan/rails/test/vendor/rails/activerecord/ lib/../../activesupport/lib/active_support/dependencies.rb:202:in`load\_file’  
> > from /Users/jonathan/rails/test/vendor/rails/activerecord/  
> > lib/…/…/activesupport/lib/active\_support/dependencies.rb:94:in  
> > `require_or_load' from /Users/jonathan/rails/test/vendor/rails/activerecord/ lib/../../activesupport/lib/active_support/dependencies.rb:248:in`load\_missing\_constant’  
> > from /Users/jonathan/rails/test/vendor/rails/activerecord/  
> > lib/…/…/activesupport/lib/active\_support/dependencies.rb:453:in  
> > `const_missing' from /Users/jonathan/rails/test/vendor/rails/activerecord/ lib/../../activesupport/lib/active_support/dependencies.rb:465:in`const\_missing’  
> > from (irb):1

## THIS WAY WORKS

## models/foo.rb

class Foo \< ActiveRecord::Base  
include FooBar  
class \<\< self  
alias\_method\_chain :find, :bar  
end  
end

## lib/foo\_bar.rb

module FooBar  
module ClassMethods  
def find\_with\_bar( \*args )  
find\_without\_bar( \*args )  
end  
end

def self.included(base)  
base.class\_eval do  
extend ClassMethods  
#alias\_method\_chain :find, :bar  
end  
end

end

---

<div class="post-metadata">

**Author:** ![linojon](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/b3f665/32.png) [@linojon](https://www.ruby-forum.com/u/linojon)\
**Post date:** [August 7, 2008, 5:05pm UTC](https://www.ruby-forum.com/t/alias-method-chain-fails/145284/2 "2008-08-07T17:05:56Z")

</div>

thanks, that did it  
blogged at  
[http://www.vaporbase.com/postings/alias\_method\_chain\_in\_a\_module](http://www.vaporbase.com/postings/alias_method_chain_in_a_module)

On Aug 7, 8:33 am, Frederick C. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

---

<div class="post-metadata">

**Author:** ![linojon](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/b3f665/32.png) [@linojon](https://www.ruby-forum.com/u/linojon)\
**Post date:** [August 7, 2008, 2:34pm UTC](https://www.ruby-forum.com/t/alias-method-chain-fails/145284/3 "2008-08-07T14:34:40Z")

</div>

On 7 Aug 2008, at 13:19, linojon wrote:

> I’m getting this weird undefined method error with  
> alias\_method\_chain. Same if I change find to save or whatever. It  
> fixes if I move the alias\_method\_chain out of the module (see  
> bottom of this email). What could be causing this?

basically because you’re not calling alias\_method\_chain on the right  
class:

> def self.included(base)  
> base.class\_eval do  
> extend ClassMethods  
> alias\_method\_chain :find, :bar  
> end  
> end

Is the same as you doing

class Foo \< AR:Base  
alias\_method\_chain :find, :bar  
end

which obviously doesn’t work

base.class\_eval do  
extend ClassMethods  
class \<\< self  
alias\_method\_chain :find, :bar  
end  
end  
end

should
