Unable to override methods built with alias_method_chain

18 views
Skip to first unread message

masta Blasta

unread,
Sep 17, 2013, 7:59:06 PM9/17/13
to rubyonra...@googlegroups.com
I am using this plugin and trying to extend it:

https://github.com/goncalossilva/subdomain_routes/blob/master/lib/subdomain_routes/url_writer.rb

The plugin heavily modifies some the Rails routing (Rails 2.3.x in this
case, but that's not important)

It usually follows this pattern:


module SubdomainRoutes
module UrlWriter
def self.included(base)
base.alias_method_chain :rewrite, :subdomains
end

def native_plugin_method
...a bunch of code
end

def rewrite_with_subdomains
...code
end
end
end

ActionController::UrlWriter.send :include, SubdomainRoutes::UrlWriter

In my own classes I am attempting to override some of these methods. So
i do this:

module CustomRouting

def native_plugin_method
#successfully invoked
...a bunch of code
super #will call method from SubdomainRoutes::UrlWriter
end

def rewrite_with_subdomains
#method is never invoked
...code
super
end
end

ActionController::UrlWriter.send :include, CustomRouting

The method created with alias_method_chain is never affected! My code
successfully overrides 'native_plugin_method', but it seems to do
nothing with rewrite_with_subdomains, even though everything is
identical.

Is there something about aliased methods that does not resolve in the
same way as standard methods?

--
Posted via http://www.ruby-forum.com/.

Frederick Cheung

unread,
Sep 17, 2013, 9:44:27 PM9/17/13
to rubyonra...@googlegroups.com


On Tuesday, September 17, 2013 8:59:06 PM UTC+1, Ruby-Forum.com User wrote:

The method created with alias_method_chain is never affected! My code
successfully overrides 'native_plugin_method', but it seems to do
nothing with rewrite_with_subdomains, even though everything is
identical.

Is there something about aliased methods that does not resolve in the
same way as standard methods?


aliasing pretty much creates a copy of a method - later attempts to redefine the original method don't affect the copy. For example

class Example
  def foo
    puts "foo"
  end

  alias_method :bar, :foo

  def foo
    puts "new foo"
  end
end

Example.new.foo() #=> "new foo"
Example.new.bar() #=> "foo"

You'll have to do your own alias method chaining when you include your module (in newer versions of rails alias_method_chain has falled out of favour)

Fred

masta Blasta

unread,
Sep 18, 2013, 2:27:30 PM9/18/13
to rubyonra...@googlegroups.com
Frederick Cheung wrote in post #1121711:
That's exactly what it was! I had to re-alias the method names.

So the original plugin used alias_method_chain to alias :rewrite,
:rewrite_with_subdomain

I had to restructure my module like this:

module CustomRouting
def included(base)
base.send :alias_method, :rewrite, :rewrite_with_subdomains
end

def native_plugin_method
#successfully invoked
...a bunch of code
super #will call method from SubdomainRoutes::UrlWriter
end

def rewrite_with_subdomains
#method is never invoked
...code
super
end
end

And now my overloaded method is correctly invoked, and the 'super' call
works properly and invokes the previous alias.

This was really complicated. phew
Reply all
Reply to author
Forward
0 new messages