# Method\_missing

**URL:** <https://www.ruby-forum.com/t/method-missing/185329>\
**Category:** Rails\
**Created:** [March 18, 2010, 11:25am UTC](https://www.ruby-forum.com/t/method-missing/185329 "2010-03-18T11:25:11Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![eugenio](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/ec9cab/32.png) [@eugenio](https://www.ruby-forum.com/u/eugenio)\
**Post date:** [March 18, 2010, 11:25am UTC](https://www.ruby-forum.com/t/method-missing/185329/1 "2010-03-18T11:25:11Z")

</div>

i’m using method\_missing to implement a simple metaprogramming that  
checks for account rights.

in Account \<\< ActiveRecord::Base i defined:

def method\_missing(m, a = {})  
if m.to\_s =~ /^has\_right\_(.\*)$/  
… calls another method passing $1 parameter  
end  
end

it seems to override some of the active record methods based on method  
missing. in the console it seems to work ok so i got some problem in  
debugging.

how can i call from Account#method\_missing the  
activeRecord::Base#method\_missing ?

---

<div class="post-metadata">

**Author:** ![eugenio](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/ec9cab/32.png) [@eugenio](https://www.ruby-forum.com/u/eugenio)\
**Post date:** [March 18, 2010, 11:33am UTC](https://www.ruby-forum.com/t/method-missing/185329/2 "2010-03-18T11:33:23Z")

</div>

On 18 March 2010 10:23, eugenio [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> i’m using method\_missing to implement a simple metaprogramming that  
> checks for account rights.
> 
> it seems to override some of the active record methods based on method  
> missing. in the console it seems to work ok so i got some problem in  
> debugging.

This explains part of the problem:  
[http://ruby.tie-rack.org/6/safely-overriding-method\_missing-in-a-class-that-already-has-it/](http://ruby.tie-rack.org/6/safely-overriding-method_missing-in-a-class-that-already-has-it/)

Calling to “super” should be part of your solution…  
def method\_missing(m, _args, &block)  
if m.to\_s =~ /^has\_right\_(._)$/  
… calls another method passing $1 parameter  
else  
super(m, \*args, &block)  
end  
end

---

<div class="post-metadata">

**Author:** ![eugenio](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/ec9cab/32.png) [@eugenio](https://www.ruby-forum.com/u/eugenio)\
**Post date:** [March 18, 2010, 12:13pm UTC](https://www.ruby-forum.com/t/method-missing/185329/3 "2010-03-18T12:13:46Z")

</div>

#i added this line:  
alias\_method :ar\_method\_missing, :method\_missing

#and an else condition in my method\_missing

def method\_missing(m,_a,&block)  
if m.to\_s =~ /^has\_right\_(._)$/  
… calls another method passing $1 parameter  
else  
ar\_method\_missing(m,\*a, &block)  
end  
end

it seems to work now.

---

<div class="post-metadata">

**Author:** ![eugenio](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/ec9cab/32.png) [@eugenio](https://www.ruby-forum.com/u/eugenio)\
**Post date:** [March 18, 2010, 12:20pm UTC](https://www.ruby-forum.com/t/method-missing/185329/4 "2010-03-18T12:20:12Z")

</div>

On Thu, Mar 18, 2010 at 12:12 PM, eugenio [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> end  
> end
> 
> it seems to work now.

Please don’t do that.

This is ordinary object-oriented programming. If you override a method  
and want to delegate to the parent just call super. That’s what super  
is for. Aliasing is an inappropriate solution to this.
