Forum: Ruby on Rails Strange behavior of alias_method_chains

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Alex S. (Guest)
on 2008-11-23 20:52
Greetings.

I've got very strange behavior of alias_method_chains, and I hope
someone will advise me.

I have a rails 2.2.2 app created with
#rails aliasApp

, a class XYZ residing in app/helpers/xyz.rb:

<code>
class XYZ

  attr_accessor :name
  attr_accessor :value

  def initialize (a, b)
    puts "in XYZ constructor"
    self.name  = a
    self.value = b
  end

  def a
    puts self.name
  end

  def b
    puts self.value
  end
end
</code>

, and an extended class XYZ in app/views/xyz_ext.rb

<code>
class XYZ
   def initialize_with_extension a,b
      puts "before chain"
      initialize_without_extension a,b
      puts "after chain"
   end
   alias_method_chain :initialize, :extension
end
</code>

So basically what I expect to have three lines in the console when
creating XYZ:
1) before chain
2) in Alias constructor
3) after chain

BUT I get something really different!

silencio:alias u2$ script/console
Loading development environment (Rails 2.2.2)
>> require 'app/views/xyz_ext.rb'
=> ["XYZ"]
>> XYZ.new 1,3
before chain
ArgumentError: wrong number of arguments (2 for 0)
from ./app/views/xyz_ext.rb:4:in `initialize_without_extension'
from ./app/views/xyz_ext.rb:4:in `initialize'
from (irb):3:in `new'
from (irb):3
>>

Any ideas on this error would be very appreciated!
Alex
Frederick C. (Guest)
on 2008-11-23 22:04
(Received via mailing list)
The problem here is that the "normal" XYZ in xyz.rb is never loaded so
you're trying to call Object's initialize, which does not take 2
arguments

Fred

Sent from my iPhone

On 23 Nov 2008, at 18:52, Alex Sonar <rails-mailing-list@andreas-
Alex S. (Guest)
on 2008-11-23 22:31
Fred,

I really appreciate your help. The following works like a charm.

silencio:alias u2$ script/console
Loading development environment (Rails 2.2.2)
>> require 'app/helpers/alias.rb'
=> ["XYZ"]
>> require 'app/views/alias_ext.rb'
=> []
>> XYZ.new 1,2
before chain
in Alias constructor
after chain
=> #<XYZ:0x259c73c @value=2, @name=1>

But having this in mind, how do I ensure that my 'app/helpers/alias.rb'
is loaded BEFORE any extended classes? Sorry if this a really newbie
question..

Alex


Frederick C. wrote:
> The problem here is that the "normal" XYZ in xyz.rb is never loaded so
> you're trying to call Object's initialize, which does not take 2
> arguments
>
> Fred
>
> Sent from my iPhone
>
> On 23 Nov 2008, at 18:52, Alex Sonar <rails-mailing-list@andreas-
Frederick C. (Guest)
on 2008-11-23 23:07
(Received via mailing list)
Require it explicitly from the extension file ?

Sent from my iPhone

On 23 Nov 2008, at 20:31, Alex Sonar <rails-mailing-list@andreas-
Alex S. (Guest)
on 2008-11-24 00:48
Thanks again!

Frederick C. wrote:
> Require it explicitly from the extension file ?
>
> Sent from my iPhone
>
> On 23 Nov 2008, at 20:31, Alex Sonar <rails-mailing-list@andreas-
This topic is locked and can not be replied to.